我对OUTER JOIN
的以下SQL(可能是微不足道的)感到困惑
我有2个小表emp
和deptno
,即有员工及其部门的记录。他们的关系显然是1-N
(但这是无关紧要的)
我正在尝试使用外部联接来查找没有员工在那里工作的部门。所以我认为正确的解决方案是OUTER JOIN
如果我执行以下操作:
select d.deptno as d_deptno, e.deptno as e_deptno
from dept d left outer join emp e
on d.deptno = e.deptno;
我明白了:
d_deptno e_deptno
10, 10
10, 10
10, 10
20, 20
20, 20
20, 20
20, 20
20, 20
30, 30
30, 30
30, 30
30, 30
30, 30
30, 30
40, null
好的,所以我认为我需要的只是最后一行,所以我只需要按如下方式修改我的查询:
select d.deptno as d_deptno, e.deptno as e_deptno
from dept d left outer join emp e
on d.deptno = e.deptno and e.deptno is null;
即。我添加了and e.deptno is null
。出于某种原因,如果我做e_deptno is null
,则无法解析查询(为什么?)
但我得到的结果如下!
d_deptno e_deptno
10, null
20, null
30, null
40, null
为什么我会得到这些结果?我对OUTER JOIN
s误解了什么?
答案 0 :(得分:3)
条件e.deptno is null
必须在where
子句中:
select d.deptno as d_deptno, e.deptno as e_deptno
from dept d left outer join emp e
on d.deptno = e.deptno
where e.deptno is null
这是因为on
子句使用指定条件的条件将行从一个表连接到另一个表 - 因此它只链接到具有空emp
的{{1}}个记录},同时匹配deptno
记录的deptno
。
由于这些条件是互斥的,因此查询永远不会成功链接到dept
记录,因此外部联接可确保为emp
值返回空值。
在连接条件之后应用emp
子句 - 因此将where
条件移动到is null
子句可确保只有where
条记录不匹配{{1}选择了记录。
dept
在emp
子句或e_deptno is null
子句中的此查询中无效,因为on
仅在select子句中定义( after < / em> where
,e_deptno
并且已经应用了任何分组 - 但它可能在having子句(在MySQL中)中有效。