sql 中没有功能,被经理和员工搞糊涂了

not in feature in sql, confused by manager and employee

假设我想获取那些不在克利夫兰的任何项目中工作的经理的姓氏和 SSN。

正确答案是:

  select 
      Lname
  from
      Employee e, Department d
  where  
      (e.ssn = d.mgrssn) 
      and ssn NOT in (select w.essn
                      from works_on w, Project p
                      where w.pno = p.pnumber
                        and p.plocation = 'Cleveland')
  1. 那么(e.ssn = d.mgrssn)是什么意思呢? mrgrssn 是经理的 ssn 吗?如果是这样,为什么不只是 select 它,而是使用 e.ssn = mgrssn?

  2. 我知道ESS不是什么意思,但是为什么不用mgrssn就不行呢?因为我们要找的是经理,而不是员工

  3. 最后为什么加了where w.pno = p.pnumber,问题没有具体问pnummber,只是location

我们将两个不同表中的经理 ssn 等同起来。这样就可以检索相关数据,pno 也会发生同样的情况。也就是说,要找到所需查询的结果,我们需要找到它们之间的某种关系。这就是这种情况下发生的情况。

  1. 经理的 ssn 在部门 table。您必须将其加入 employee 才能获得 LName。
  2. 您可以使用 mgrssn NOT IN 而不是 ssn NOT IN,因为您要在 e.ssn = d.mgrssn 处获取记录。两个值将始终相同
  3. 位置是项目 table 的一部分,而不是 works_on。但是您需要 works_on 将项目与员工相关联。因此,两个 table 都必须加入。

理解复杂查询的最佳方式是从内到外。所以:

3) 我们 select 位置为 'Cleveland' 的所有项目,加入了在每个项目中工作的员工列表,以获取在克利夫兰工作的员工的 SSN 列表.

1) 我们将部门经理的 SSN 加入到员工的 SSN 中,以获得所有部门经理的姓氏。

2) 然后我们 select 那些 SSN 不在 在克利夫兰工作的员工名单的员工(他们都是第 1 步中的经理) (来自我们首先查看的第 3 步。)

在第 2 步中,我们需要经理的姓氏。经理 SSN 在 department 中,但姓名不在,因此我们需要加入 employee 才能获得这些姓名。

在第 3 步中,我们加入项目编号,因为这是在 works_on 中识别员工的方式。