2013-04-20 66 views
8

我正在使用SQL Server(我相信它是2005)。SQL Server:左連接導致行數少於左表

我有TableA有2列和439行(每行是唯一的)。

+----------+ 
|ID | Name | 
+----------+ 

我有TableB有35列和多幾十萬行(每行也是唯一的)。

+------------------------------------------------------------------------------+ 
|Date | ID | Name | Blah1 | Blah2 | ... | Hour1 | Hour2 | Hour3 | ... | Hour24 | 
+------------------------------------------------------------------------------+ 

每一行中TableB具有每小時的觀測數據和其他一些看家信息。現在出於測試目的,我只對今天的日期感興趣,即2013年4月19日。

如果我做的:

Select count(*) 
from TableB 
where Date = '4/19/2013 12:00:00 AM' 

我得到10526,因爲有10526個其中的每一天有每小時觀測數據不同的位置這是正確的。

我想要左連接表A和表B on a.id = b.id,它應該產生一個有439行的結果。

不幸的是,結果有246行。怎麼會這樣?不是LEFT JOIN是否返回TableA中的所有行,無論TableB中是否存在匹配項?

* 編輯 *

我使用的完整的查詢是:

select * 
from TableA as a 
left join TableB as b on a.id = b.id 
where RealDate = '4/20/2013 12:00:00 AM' 
+3

可以顯示你使用的完整查詢 – PSR 2013-04-20 04:29:24

+0

@PSR - 我編輯了我原來的帖子,包括使用的原始查詢。 – codingknob 2013-04-20 04:41:40

+0

重新措辭@LoztInSpace寶貴的評論:在JOIN之前添加約束(使用WHERE)到選擇表。否則,這些約束作用於連接的結果輸出(並且可以將行數減少到比原始表更少)。 – 2015-03-26 03:26:53

回答

17

試試這個:

select * from TableA as a 
left join (SELECT * from TableB where RealDate = '4/20/2013 12:00:00 AM') as b 
on a.id = b.id 

或者這樣:

select * from TableA as a 
left join TableB as b on (a.id = b.id AND RealDate = '4/20/2013 12:00:00 AM') 
+0

這個技巧。謝謝。我是SQL的新手,所以不知道在這種情況下where子句的位置會產生如此大的差異。我很好奇,儘管我原來的查詢實際上是在做什麼。如果沒有意義,246行的結果是什麼? – codingknob 2013-04-20 05:09:31

+2

因此,您的查詢首先執行了左連接,然後再通過where子句篩選出結果。希望它是有道理的。如果沒有,我可以詳細說明。 – faisal 2013-04-20 05:17:01

+0

發生了什麼事是我原來的查詢返回'ONLY'那些行,其中a.ID = b.ID,這不符合'LEFT'加入的哲學。這很奇怪。但我會接受它並繼續前進,因爲您的解決方案是正確的,並解決了我的問題。謝謝。欣賞它。 – codingknob 2013-04-20 05:42:25