连接查询之间的语义差异

chu*_*lor 3 sql sql-server left-join sql-server-2008

我有两个问题,我认为这意味着同样的事情,但我不断得到不同的结果,我希望有人可以解释这些是如何不同的:

1.

select * 
from table1 a 
left join table2 b on a.Id = b.Id and a.val = 0
where b.Id is null
Run Code Online (Sandbox Code Playgroud)

2.

select * 
from table1 a 
left join table2 b on a.Id = b.Id 
where b.Id is null 
    and a.val = 0
Run Code Online (Sandbox Code Playgroud)

查询的要点是查找table1中的行和val = 0中不在table2中的行.

我也在使用sql server 2008,但我怀疑这应该是重要的.

Mar*_*ith 9

在考虑左连接时,将它们视为具有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
Run Code Online (Sandbox Code Playgroud)

而事实并非如此.

select o.* 
from sys.objects o
left join sys.objects o2 on o.object_id=o2.object_id 
where 1=0
Run Code Online (Sandbox Code Playgroud)