左连接中的Where和AND有什么区别?

5

通常在执行左连接时,我不会在同一行中使用ONAND,因为我过去曾遇到问题。相反,我更喜欢将任何其他条件放在可靠的WHERE子句中,以避免这种麻烦。但是今天,出于好奇,我想提出这个问题,并最终澄清。

问题:当我在LEFT JOIN中使用“额外”条件时,实际发生了什么?为什么它的行为与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
2个回答

8
这个版本是根据a.id进行过滤的:
select *
from #a a left join
     #b b
     on a.id = b.id 
where a.id = 3

该版本不对a.id进行过滤:

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

为什么不呢?看一下左联接 (left join) 的定义。它会从第一个表中获取所有行,而不管 on 子句的计算结果是真、假还是NULL。因此,在左联接中,第一个表上的过滤器不起作用。
第一个表上的过滤器应该在where 子句中。第二个表上的过滤器应该在 on 子句中。

0

你可以在ON子句中对“右表”列设置条件。


条件在左表中。 - Gordon Linoff
这是一个通用的答案,也许不适用于示例查询。 - jarlh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接