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

前端之家收集整理的这篇文章主要介绍了sql – 计算左连接中连接的行数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在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

我在这里做错了什么?

解决方法

这样的事情呢
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;

希望有帮助.

猜你在找的MsSQL相关文章