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

4

4 回答 4

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 

更新小提琴

于 2013-02-21T14:28:36.360 回答
0

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

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

但是 2 月 4 日缺少 type 的值,因此它们为空。

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

于 2013-02-21T14:32:59.170 回答
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 )
于 2013-02-21T14:33:28.073 回答
0

你可以 make aLEFT JOIN并使用 aIFNULL

SELECT table2.id, table2.month, IFNULL(table1.type, 0) as type FROM t2 as table2 LEFT JOIN t1 table1 ON table2.id = table1.id
于 2013-02-21T14:34:07.693 回答