2013-02-20 43 views
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 

,但我从来没有得到过第二行。为什么这会留下连接跳过缺失的行?

+0

空记录是上个月不存在的记录。对我来说,这与将两个不同的表格合并在一起,一个与前几个月的数据和一个与当前的月份数据一起。我应该能够将上个月的所有数据与当前的月份数据进行比较,包括不存在的行。 – metrix 2013-02-20 20:44:24

回答

1

很简单,因为在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' 
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' 

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

+0

不幸的是,这会返回数字1和2的空记录。 – metrix 2013-02-20 20:48:09

+0

实际上,这返回4行。不只是OP想要的2个。您需要将new.adddttm部分保留在WHERE子句中。 – 2013-02-20 20:48:32

+0

好的,现在试试 – muhmud 2013-02-20 20:55:02