我通常不会在执行 a 时AND在同一行中使用 an ,因为我过去遇到过问题。我宁愿不进入这个泡菜,而是将任何附加条件放在一个可靠的子句中。但是今天,出于好奇,我很想提出这个问题并一劳永逸地澄清。ONLEFT JOINWHERE
问题: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
Run Code Online (Sandbox Code Playgroud)
此版本过滤a.id:
select *
from #a a left join
#b b
on a.id = b.id
where a.id = 3
Run Code Online (Sandbox Code Playgroud)
此版本不过滤a.id:
select *
from #a a left join
#b b
on a.id = b.id and a.id = 3;
Run Code Online (Sandbox Code Playgroud)
为什么不?转到 的定义left join。它从第一个表中获取所有行,无论该on子句的计算结果是 true、false 还是NULL。因此,第一个表上的过滤器对left join.
第一个表上的过滤器应该在where子句中。第二个表上的过滤器应该在on子句中。
| 归档时间: |
|
| 查看次数: |
2588 次 |
| 最近记录: |