一尘不染

连接查询之间的语义差异

sql

我有两个我以为是同一意思的查询,但是我一直得到不同的结果,我希望有人可以解释这些差异如何:

1。

select * 
from table1 a 
left join table2 b on a.Id = b.Id and a.val = 0
where b.Id is null

2。

select * 
from table1 a 
left join table2 b on a.Id = b.Id 
where b.Id is null 
    and a.val = 0

查询的重点是查找表1中的行和val = 0而不是表2中的行。

我也使用sql server 2008,但是我怀疑这是否重要。


阅读 163

收藏
2021-03-08

共1个答案

一尘不染

在考虑左联接时,应将它们视为具有3个概念阶段。

  1. 应用联接过滤器
  2. 左侧的行又被添加回
  3. 应用where子句。

然后,您将看到为什么得到不同结果的原因。

这也解释了为什么返回结果

select o.* 
from sys.objects o
left join sys.objects o2 on o.object_id=o2.object_id and 1=0

而事实并非如此。

select o.* 
from sys.objects o
left join sys.objects o2 on o.object_id=o2.object_id 
where 1=0
2021-03-08