1

設定

create table #history (
adddttm date,
number int
)
insert into #history values ('2013-01-01 08:56:00.000',1);
insert into #history values ('2013-01-01 08:56:00.000',2);
insert into #history values ('2013-02-13 08:56:00.000',2);
insert into #history values ('2013-02-13 08:56:00.000',3);

クエリ

select *
from #history new
left join #history old
  on new.number = old.number
where new.adddttm = '2013-02-13 08:56:00.000'
and   old.adddttm = '2013-01-01 08:56:00.000'

次のクエリが返されると思います。

----------|-|----------|-
2013-02-13|2|2013-01-01|2
2013-02-13|3|null      |null

しかし、私は2行目を取得することはありません。この左結合が欠落している行をスキップするのはなぜですか?

4

2 に答える 2

2

where 句で old.adddttm を参照しているためです。その理由について、記事 Fun with Outer Joinsをかなり詳しく書いています。繰り返しますが、ON 句は 2 つのテーブル間の結合のみを目的としており、WHERE 句は結果セットの制限のみを目的としているためです。ただし、この 2 つを混同するのは簡単です。

このクエリは機能します。

select *
from #history new
left join #history old
  on new.number = old.number 
  and old.adddttm = '2013-01-01 08:56:00.000'
WHERE new.adddttm = '2013-02-13 08:56:00.000'
于 2013-02-20T20:38:18.073 に答える
1

where句は行を除外しています。

select old.*
from history new
left join history old
  on new.number = old.number and old.adddttm = '2013-01-01 08:56:00.000' 
where new.adddttm = '2013-02-13 08:56:00.000' 

これで、結合行が取得されない場合、期待どおりにnullが取得されます。

于 2013-02-20T20:40:37.107 に答える