2013-02-21 28 views
1

我有這樣SQL從2個表中選擇其中的關鍵是不是在某些行中1個表

ID  Type 
---  ------- 
1  17  
2  18  
3  18 
10  16 

而第二臺這樣

ID  Month 
---  ------- 
1  Feb  
2  Feb  
3  Feb 
4  Feb  

我想選擇一個表第二個表格中的所有內容都與第一個表格中的類型匹配。如果它在第一個表格中沒有匹配的ID,我仍然想要顯示它。

現在我在做這個查詢

select t2.id, t2.month, t1.type 
from t2, t1 
where t1.id = t2.id 

,它是給我這個結果

ID MONTH TYPE 
1 Feb  17 
2 Feb  18 
3 Feb  18 

但我想是這樣的結果

ID MONTH TYPE 
1 Feb  17 
2 Feb  18 
3 Feb  18 
4 Feb  0 

哪有我寫了一個SQL語句,這會給我上面的結果嗎?

SQL小提琴:http://sqlfiddle.com/#!2/c90f5/1

回答

1

你只需要使用一個LEFT JOIN - 我也用COALESCE爲類型返回0 - 你也可以使用IFNULL

SELECTt2.id, t2.month, COALESCE(t1.type,0) type 
FROM t2 LEFT JOIN t1 
    ON t1.id = t2.id 

Updated Fiddle

+0

完美!謝謝。 – qaz 2013-02-21 14:32:05

+0

@qaz - 沒問題,很高興我可以幫忙。 – sgeddes 2013-02-21 14:32:49

0

您必須使用外部聯接,它可以爲您提供一個表的所有行以及另一個表的聯接值。像這樣:

select t2.id, t2.month, t1.type 
from t2 left outer join t1 
on t1.id = t2.id 

但是類型的值在feb的第4箇中丟失,所以它們爲空。

如果這是您所需要的,您必須在字段列表中將null映射爲0,但我不會推薦這樣做,因爲這完全是錯誤的。

+0

一個很好的解釋,謝謝 – qaz 2013-02-21 14:50:33

0
SELECT t2.id, t2.month, t2.type 
FROM t2 LEFT OUTER JOIN t1 
    ON t1.id = t2.id 
UNION(
SELECT t2.id, t2.month, '0' AS type 
FROM t2 
EXCEPT 
SELECT t2.id, t2.month, '0' AS type 
FROM t2 LEFT OUTER JOIN t1 
    ON t1.id = t2.id) 
0

你可以做一個LEFT JOIN和使用IFNULL

SELECT table2.id, table2.month, IFNULL(table1.type, 0) as type FROM t2 as table2 LEFT JOIN t1 table1 ON table2.id = table1.id 
相關問題