2

我对OUTER JOIN.
我有 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 JOINs 有什么误解?

4

1 回答 1

2

条件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具有 null 的记录deptno,同时deptno匹配该dept记录。

由于这些条件是互斥的,查询将永远不会成功链接到emp记录,因此外连接确保为值返回空emp值。

where子句在连接条件之后应用 - 因此将is null条件移动到where子句中可确保仅选择dept没有匹配emp记录的记录。

e_deptno is nullon在子句或子句中的此查询中无效,where因为e_deptno仅在 select 子句中定义(,和任何分组已应用之后) - 但是onwhere它可能在 have 子句中有效(在 MySQL 中)。

于 2013-07-07T15:44:38.147 回答