1

where句ではなく、外部結合句でフィルターを使用してテーブルをフィルターで除外しようとしています。そうしようとすると、予期しない結果が得られます。フィルタをまったく適用しなかったかのように、テーブル全体が返されます。

この例を実行すると、最後の2つのクエリで異なる結果が得られます。同じ結果になると思いますが、そうではありません。ここで何が起こっているのですか?

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からのすべての行を指定しa、これをwhereid=1の任意の行と相関させてみてください。ba.id=b.id

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

一方、「からのすべての行を教えてくださいa。もしそうなら、これを wherea.id=1の任意の行と相関させてみてください(そうでない場合は、からのデータを教えてください)。ba.id=b.ida

これを内部結合と比較してください。ここで、条件をON句に追加し、それを句に追加することWHEREは同義語です。

于 2012-07-17T15:29:29.620 に答える