我正在写一个有关“写查询以查找非主管员工姓名(名字,姓氏”)的练习
我自己编写它,当我检查结果或两者兼而有之时,我的行比另一个少。 我正在使用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);
答案 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,那么这些数据将被删除,结果将不会是预期的。