SQL从2个表中选择,其中key不在1个表的某些行中

时间:2013-02-21 14:27:37

标签: mysql sql

我有一张这样的表

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您必须使用外部联接,它为您提供一个表的所有行以及另一个表的连接值。像这样:

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

但是,对于4号feb,类型的值缺失,因此它们为空。

如果这是你需要的,你必须在字段列表中将null映射到0,但我不建议这样做,因为它完全错了。

答案 2 :(得分: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 )

答案 3 :(得分: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