【发布时间】:2016-11-01 14:10:09
【问题描述】:
我遇到了以下关于 Oracle 附带的著名 HR 架构的 SQL 问题:
编写一个 SQL 查询来查找每个位置的所有位置和部门,以及没有部门的位置。不要使用外连接。
OUTER JOIN 很容易:
SELECT department_name, city
FROM locations
LEFT OUTER JOIN departments USING (location_id);
我得到 43 个结果。我试过这个:
SELECT department_name, city
FROM locations l, departments d
WHERE l.location_id = d.location_id OR
l.location_id NOT IN (SELECT DISTINCT location_id FROM departments);
但我只得到 27 行,就好像我这样做:
SELECT department_name, city
FROM locations
JOIN departments USING (location_id);
为什么OR 不起作用?谢谢!
编辑:
正如@mathguy 所指出的,我在departments 表的location_id 列中有一个NULL 部门。这就是NOT IN 不返回任何行的原因。否则我会有更多的行从departments 表中寻找位置ID。
【问题讨论】:
-
可能错误的查询是第一个,而不是第二个。左外连接应该使用 ON,而不是 USING
-
@Massimo,为什么?它确实产生了预期的结果。
-
@Massimo 进一步阅读“由于此示例中的列名在连接中的两个表中相同,因此您还可以通过指定连接语法的 USING 子句来使用公共列功能。”
-
你说得对,我不知道...我链接到“传统”sql