В чем разница при добавлении критерия фильтра во внешнее соединение вместо предложения where?

Я пытаюсь отфильтровать таблицу, используя фильтр в предложении внешнего соединения, а не в предложении 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

person FistOfFury    schedule 17.07.2012    source источник
comment
Посмотрите здесь: > stackoverflow.com/questions/10297231/   -  person StuartLC    schedule 17.07.2012


Ответы (1)


Внешнему объединению разрешено возвращать NULL для строки присоединяемой таблицы, тогда как предложение where должно быть сопоставлено до того, как будет возвращен результат.

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 являются синонимами.

person lc.    schedule 17.07.2012
comment
поэтому, если я правильно понимаю, фильтр в предложении соединения ограничивает набор результатов одной из таблиц, но не обеих. тогда как предложение where фильтрует оба. - person FistOfFury; 18.07.2012