2013-02-21 53 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 
相关问题