【发布时间】:2013-12-05 20:38:23
【问题描述】:
我正在尝试在 SQL 中编写一个聚合查询,它返回连接到表中给定记录的所有记录的计数;如果没有记录连接到给定记录,那么该记录的结果应该是0:
数据
我的数据库看起来像这样(很遗憾,我无法更改结构):
MESSAGE
----------------------------------------------
MESSAGEID SENDER SUBJECT
----------------------------------------------
1 Tim Rabbit of Caerbannog
2 Bridgekeeper Bridge of Death
MESSAGEPART
----------------------------------------------
MESSAGEID PARTNO CONTENT
----------------------------------------------
1 0 (BLOB)
1 1 (BLOB)
3 0 (BLOB)
(MESSAGEPART 有一个复合 PRIMARY KEY("MESSAGEID", "PARTNO"))
期望的输出
根据上面的数据,我应该得到这样的结果:
MESSAGEID COUNT(*)
-----------------------------------------------
1 2
2 0
很明显,我需要对MESSAGE 表进行左连接,但是对于来自MESSAGEPART 的连接列是NULL 的行,我如何返回0 的计数?我尝试了以下方法:
逻辑
我试过了
SELECT m.MESSAGEID, COUNT(*) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY m.MESSAGEID;
但是,这会返回
MESSAGEID COUNT(*)
-----------------------------------------------
1 2
2 1
我也试过
SELECT mp.MESSAGEID, COUNT(*) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY mp.MESSAGEID;
但这会返回
MESSAGEID COUNT(*)
-----------------------------------------------
1 2
1
我在这里做错了什么?
【问题讨论】:
-
首先,使用
m.MESSAGEID(永远存在)而不是mp.MESSAGEID(只有在匹配时才会存在)。
标签: sql oracle join count left-join