在执行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
答案 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子句中的“右表”列中添加条件。