1

我正在尝试使用外部联接子句中的过滤器而不是 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
4

1 回答 1

4

外连接允许为连接表的行返回 NULL,而 where 子句必须在返回结果之前匹配。

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

转换为“给我 where 中的所有行aid=1并尝试将其与bwhere 中的任何行相关联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 where的任何行相关联a.id=b.id(否则只给我来自 的数据a)。

将此与内部连接进行对比,其中向ON子句添加条件并将其添加到WHERE子句是同义词。

于 2012-07-17T15:29:29.620 回答