LEFT JOIN 中的 Where 与 AND

Sou*_*avA 2 sql sql-server

我通常不会在执行 a 时AND在同一行中使用 an ,因为我过去遇到过问题。我宁愿不进入这个泡菜,而是将任何附加条件放在一个可靠的子句中。但是今天,出于好奇,我很想提出这个问题并一劳永逸地澄清。ONLEFT JOINWHERE

问题LEFT JOIN当我使用“exta”条件时,到底发生了什么?为什么它的行为方式与WHERE?

示例查询

create table #a
(
id int,
name varchar(3)
)


create table #b
(
id int,
name varchar(3)
)

insert into #a
select 1, 'abc'
union
select 2, 'def'
union
select 3, 'ghi'


insert into #b
select 1, 'abc'
union
select 2, 'def'

select * from #a a left join #b b on a.id = b.id 
where a.id = 3

select * from #a a left join #b b on a.id = b.id 
and a.id = 3
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

此版本过滤a.id

select *
from #a a left join
     #b b
     on a.id = b.id 
where a.id = 3
Run Code Online (Sandbox Code Playgroud)

此版本不过滤a.id

select *
from #a a left join
     #b b
     on a.id = b.id and a.id = 3;
Run Code Online (Sandbox Code Playgroud)

为什么不?转到 的定义left join。它从第一个表中获取所有行,无论该on子句的计算结果是 true、false 还是NULL。因此,第一个表上的过滤器对left join.

第一个表上的过滤器应该在where子句中。第二个表上的过滤器应该在on子句中。