添加过滤条件时,外部,而不是加入一个WHERE子句的区别是什么?(What is the diffe

2019-10-17 01:31发布

我试图筛选出使用过滤器的表外连接子句中,而不是在where子句。 当我尝试这样做,我得到意想不到的效果。 好像我根本不应用滤镜的整个表被返回。

当我运行这个例子中,我得到的最后两个查询不同的结果。 我希望他们有相同的结果,但它并非如此。 这里发生了什么?

declare @a table
(
    id int
    ,content varchar(100)
)
declare @b table
(
    id int
    ,content varchar(100)
)

insert into @a (id,content) values (1,'Apple')
insert into @a (id,content) values (2,'Banana')
insert into @a (id,content) values (3,'Orange')
insert into @b (id,content) values (1,'Juice')
insert into @b (id,content) values (2,'Peel')
insert into @b (id,content) values (3,'Julius')

--basic outer join
select * from @a a left join @b b on a.id=b.id

--outer join with where clause filter
select * from @a a left join @b b on a.id=b.id where a.id=1

--outer join with join clause filter
select * from @a a left join @b b on a.id=1 and a.id=b.id

Answer 1:

外连接被允许的连接表的行返回NULL,而其中返回结果前子句必须匹配。

select * from @a a left join @b b on a.id=b.id where a.id=1

从翻译到“给我的所有行a ,其中id=1 ,并尝试与任何行关联这个b其中a.id=b.id

select * from @a a left join @b b on a.id=1 and a.id=b.id

而另一方面,从翻译到“给我所有行a ,如果a.id=1 ,尝试用在任何行关联这个b其中a.id=b.id (否则就给我从数据中a ) 。

对比这与内部联接,其中增加了一个条件ON子句和将其添加到WHERE子句是同义的。



文章来源: What is the difference when adding a filter criteria to an outer join instead of a where clause?