我通常不会在执行时使用AND同一行,因为我过去曾遇到过问题。我宁愿不要进入这个泡菜,而是将任何其他条件放在一个可靠的子句中。但是今天,出于好奇,我很想提出这个问题,并一劳永逸地弄清楚。ON``LEFT JOIN``WHERE
AND
ON``LEFT JOIN``WHERE
问题 :LEFT JOIN当我使用“ exta”条件时,真正发生了什么?为什么它的行为方式不相同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
这个版本的筛选条件a.id:
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。
left join
on
NULL
第一个表上的过滤器应在where子句中。第二个表上的过滤器应在on子句中。
where