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

但我从来没有得到第二排。为什么这个左连接会跳过丢失的行?

4

2 回答 2

2

很简单,因为 where 子句中引用了 old.adddttm。我写了一篇文章 Fun with Outer Joins,其中详细说明了原因。再次非常简单,因为 ON 子句仅用于两个表之间的连接,而 WHERE 子句仅用于限制结果集。不过很容易混淆这两者。

此查询将起作用。

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' 

现在,当它没有获得连接行时,您会按预期获得空值。

于 2013-02-20T20:40:37.107 回答