JOIN子查询和不同的reault

时间:2018-11-11 01:06:55

标签: mysql sql

我正在写一个有关“写查询以查找非主管员工姓名(名字,姓氏”)的练习

我自己编写它,当我检查结果或两者兼而有之时,我的行比另一个少。 我正在使用JOIN函数,而另一个则没有。 我想帮忙了解为什么两个结果如此不同。

谢谢

  

我使用的那个加入

SELECT 
first_name, last_name
FROM
employees AS E
    JOIN
departments AS D ON E.department_id = D.department_id
WHERE
NOT EXISTS( SELECT 
        0
    FROM
        departments
    WHERE
        E.manager_id = D.manager_id)
        order by last_name;
  

一个不使用加入

SELECT 
b.first_name, b.last_name
FROM
employees b
WHERE
NOT EXISTS( SELECT 
        0
    FROM
        employees a
    WHERE
        a.manager_id = b.employee_id);

2 个答案:

答案 0 :(得分:0)

最大的问题是NOT EXISTS子查询正在引用联接表中的行。 manager_id列用D.限定,这是对联接表的引用,而不是子查询的FROM子句中的表。

          E.manager_id = D.manager_id
            ^^^^^^^      ^

我们还怀疑雇员的主管记录在雇员行中,作为对雇员表中另一行的引用。但是我们没有架构定义或任何示例数据,因此我们只是在猜测。

supervisor_id表中似乎有一个employee ...


SELECT e.first_name
     , e.last_name
     , e.department_id
     , d.department_id
  FROM employees e
 WHERE NOT EXISTS 
       ( SELECT 1  
           FROM employees s 
          WHERE s.id = e.supervisor_id
       ) 
 ORDER
    BY e.last_name
     , e.first_name

employee中的某些行在department_id列中有一个值也可能在department表中没有匹配的行。如果department中没有匹配的行,则内部联接将阻止返回employee中的行。

即使在联接表中找不到匹配的行时,我们也可以使用外部联接来返回行。如果要包含departments表,因为“主管”被定义为是部门经理的雇员,则可以采用反联接模式...

SELECT e.first_name
     , e.last_name
  FROM employees e
  LEFT
  JOIN departments d
    ON d.manager_id = e.employee_id 
 WHERE d.manager_id IS NULL 
 ORDER
    BY e.last_name
     , e.first_name

同样,没有模式和一些示例数据,我们只是在猜测。

答案 1 :(得分:0)

只能使用雇员表来编写此查询,但是在查询中您已将雇员表与部门表连接在一起。使用最小数量的表就可以编写查询,该表应足以满足您的预期输出,而将不必要的表连接起来可能会导致错误的输出。

在这种情况下,您要在这里将员工加入部门,如果某些员工的雇员表中没有Department_ID,那么这些数据将被删除,结果将不会是预期的。