sql - 计算左连接中连接的行数

标签 sql oracle join count left-join

我正在尝试用 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 进行左连接。表,但如何返回 0 的计数对于来自 MESSAGEPART 的连接列的行是 NULL ?我尝试了以下方法:

逻辑

我试过了
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

我在这里做错了什么?

最佳答案

这样的事情怎么样:

SELECT m.MESSAGEID, sum((case when mp.messageid is not null then 1 else 0 end)) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY m.MESSAGEID;

COUNT() 函数将对每一行进行计数,即使它为空。使用 SUM() 和 CASE,您只能计算非空值。

编辑:取自顶级评论的更简单版本:
SELECT m.MESSAGEID, COUNT(mp.MESSAGEID) FROM MESSAGE m
LEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEID
GROUP BY m.MESSAGEID;

希望有帮助。

关于sql - 计算左连接中连接的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20119901/

相关文章:

SQL 使用 OBJECT 作为 ORDER 方法的参数

Mysql 5个表之间的连接问题

mysql - rails : Can joins be merged when chaining scopes?

java - 写入数据库时​​出现异常(org.hibernate.exception.ConstraintViolationException)

sql - 如何将一个表中的记录集和其他记录集加载到ssis中的不同表中

mysql - 在 if/else block 内创建表的问题

sql - Oracle 动态透视

mysql - 在 mysql 查询中传递字符串参数时没有输出

屏幕窗口中的 Python 脚本,cx_oracle 错误

php - 拉拉维尔。加入后保持 Eloquent 关系