LEFT JOIN中与AND的位置

时间:2014-12-17 15:46:33

标签: sql sql-server

在执行AND时,我通常不会在ON的同一行使用LEFT JOIN,因为我过去遇到过问题。我宁愿不进入这个pickle而是在WHERE子句中添加任何附加条件,这是可靠的。但今天,出于好奇,我很乐意提出这个问题并一劳永逸地清楚。

问题:当我使用" exta" 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 个答案:

答案 0 :(得分:4)

此版本会在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子句中。

答案 1 :(得分:0)

您可以在ON子句中的“右表”列中添加条件。