Mysql 为什么这个左外连接会产生错误的结果?
我对Mysql 为什么这个左外连接会产生错误的结果?,mysql,sql,join,left-join,outer-join,Mysql,Sql,Join,Left Join,Outer Join,我对外部连接上的以下SQL(可能很简单)感到困惑 我有两个小表格emp和deptno,即有员工及其部门的记录。它们的关系显然是1-N(但这是不相关的)。 我正在尝试使用外部联接查找没有员工在那里工作的部门号。因此我认为正确的解决方案是外部联接 如果我这样做: select d.deptno as d_deptno, e.deptno as e_deptno from dept d left outer join emp e on d.deptno = e.deptno; 我得
外部连接上的以下SQL(可能很简单)感到困惑
我有两个小表格emp
和deptno
,即有员工及其部门的记录。它们的关系显然是1-N
(但这是不相关的)。
我正在尝试使用外部联接查找没有员工在那里工作的部门号。因此我认为正确的解决方案是外部联接
如果我这样做:
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;
也就是说,我添加了,而e.deptno为null
。出于某种原因,如果我执行了e_deptno为null
则无法解析查询(为什么?
但我得到的结果如下
d_deptno e_deptno
10, null
20, null
30, null
40, null
为什么我会得到这些结果?我对外部联接
s有什么误解?条件e.deptno为空
需要在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
子句使用指定为条件的条件将行从一个表连接到另一个表-因此它将只链接到具有空deptno
的emp
记录,同时链接到与deptno
记录匹配的deptno
由于这些条件是互斥的,因此查询永远不会成功链接到emp
记录,因此外部联接确保为emp
值返回空值
where
子句在连接条件之后应用,因此将为null
条件移动到where
子句中可确保仅选择不匹配emp
记录的dept
记录
e_deptno为null
在本查询中在on
子句或where
子句中无效,因为e_deptno
仅在select子句中定义(在on
之后,where
和任何分组应用后)-它可能在having子句中有效(在MySQL中),但是。那么,我在……和
上的版本有什么作用呢?还有任何关于为什么e_deptno
不被接受为查询的一部分的想法吗?+1所以它只会链接到deptno为空的emp记录,同时deptno与dept记录匹配
你是说emp
中的记录与e.deptno
匹配,而emp记录的deptno
为null
对吗?@Jim:我的意思是为了匹配,每个emp
记录的deptno
值必须同时为null,并与dept
记录的值相匹配。您应该在where子句中添加第二个条件,其中e.deptno也为null
,您不能在where条件下使用别名。@chetan:所以我不能在and或etc上加入?是的,您可以在。。而且。。。或等等。如果您有多个连接条件,但您应该在where子句中添加文字比较(警告:long)答案:,特别是粗体部分,它说:“我的观点是,这些空值是在左外部连接期间创建的(在结果集中)。”您在第1个查询的结果中看到的空值,行:40,null
由外部联接生成。它不在桌子上。