2012-03-29 90 views
1

我有一個包含用戶ID,週期ID和數量表:外部聯接不顯示想(空)行

User Period Qty 
---- ------ --- 
    1 11201 3 
    1 11202 2 
    1 11203 5 
    2 11202 4 
    2 11203 1 

注:用戶2期11202開始,所以他/她沒有一行週期11201

我只需要從最近一段時期得到了用戶...

SELECT User FROM table WHERE Period = 11203 

...然後使用同一個表,這些用戶ID來獲得期間11201和11202的數量兩個用戶。

問題:我需要查看(null)期間用戶2的數量11201。像這樣:

User Period Qty 
---- ------ ----- 
    1 11201  3 
    1 11202  2 
    2 11201 (null) 
    2 11202  4 

我無法弄清楚查詢/連接來實現它。到目前爲止,我有這個,但可以預見它給我的只有3行(用戶1,週期一萬一千二百零二分之一萬一千二百零一和用戶2期11202):

SELECT a.User, a.Period, a.Qty 
FROM (SELECT User FROM table WHERE Period = 11203) b 
LEFT JOIN table a 
ON b.User = a.User 
WHERE a.Period BETWEEN 11201 AND 11202 

回答

1

你需要得到所有需要的時段,讓這些與用戶笛卡爾積,然後再外連接到:也

SELECT b.User, p.Period, a.Qty 
FROM (SELECT User FROM table WHERE Period = 11203) b 
CROSS JOIN (SELECT DISTINCT Period FROM table 
      WHERE Period BETWEEN 11201 AND 11202) p 
LEFT JOIN table a 
ON a.User = b.User 
AND a.Period = p.Period 

注意SELECT需要得到用戶和從外表開始的時間不是內部時間,否則在用戶丟失的行上的所有內容都將爲空。

3

您的where子句過濾掉a.Period爲空的行。它移動到on條款:

LEFT JOIN table a 
ON a.User = b.User 
AND a.Period = p.Period 
AND a.Period BETWEEN 11201 AND 11202 

或明確接受null值:

WHERE a.Period is null OR a.Period BETWEEN 11201 AND 11202