为什么这个左外连接会产生错误的结果?

时间:2013-07-07 15:40:17

标签: mysql sql join left-join outer-join

我对OUTER JOIN的以下SQL(可能是微不足道的)感到困惑 我有2个小表empdeptno,即有员工及其部门的记录。他们的关系显然是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误解了什么?

1 个答案:

答案 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}选择了记录。

deptemp子句或e_deptno is null子句中的此查询中无效,因为on仅在select子句中定义( after < / em> wheree_deptno并且已经应用​​了任何分组 - 但它可能在having子句(在MySQL中)中有效。