2013-02-20 38 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