admin

vs AND AND在LEFT JOIN中

sql

我通常不会在执行时使用AND同一行,因为我过去曾遇到过问题。我宁愿不要进入这个泡菜,而是将任何其他条件放在一个可靠的子句中。但是今天,出于好奇,我很想提出这个问题,并一劳永逸地弄清楚。ON``LEFT JOIN``WHERE

问题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

阅读 167

收藏
2021-06-07

共1个答案

admin

这个版本的筛选条件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子句的计算结果为true,false还是,它都会从第一个表中获取所有行NULL。因此,第一个表上的过滤器对中的没有影响left join

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

2021-06-07