gpt4 book ai didi

mysql - JOIN子查询和不同的结果

转载 作者:行者123 更新时间:2023-11-29 16:43:06 26 4
gpt4 key购买 nike

我正在编写一个关于“编写查询来查找非主管员工的姓名(名字、姓氏)”的练习

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

谢谢

the one i use 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;

the one doesn't use join

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);

最佳答案

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

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

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

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

<小时/>
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 中没有匹配的行 table 。如果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

同样,在没有架构和一些示例数据的情况下,我们只是猜测。

关于mysql - JOIN子查询和不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53244953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com