What is the difference when adding a filter criteria to an outer join instead of a where clause?

偶尔善良 提交于 2019-12-24 14:16:00

问题


I'm trying to filter out a table using filter in the outer join clause rather than a where clause. When i try to do so i'm getting unexpected results. The whole table is returned as though i didn't apply the filter at all.

When I run this example, i get different results for the last two queries. I would expect them to have the same results but it's not the case. What is going on here?

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

回答1:


An outer join is allowed to return NULL for the joined table's row, whereas a where clause must be matched before the result is returned.

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

translates to "Give me all rows from a where id=1 and try to correlate this with any rows in b where a.id=b.id.

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

on the other hand, translates to "Give me all rows from a and, if a.id=1, try to correlate this with any rows in b where a.id=b.id (otherwise just give me the data from a).

Contrast this with an inner join, where adding a condition to the ON clause and adding it to the WHERE clause is synonymous.



来源:https://stackoverflow.com/questions/11525707/what-is-the-difference-when-adding-a-filter-criteria-to-an-outer-join-instead-of

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!