假设有两个表:
表A
messageID / Message / More..
1 / This is the first message / Etc..
2 / This is the second message / Etc..
3 / This is the third message / Etc..
表B
commentID / messageID / Comment
1 / 2 / This is a comment to the second message
2 / 2 / This is another comment to the second message
3 / 3 / This is a comment to the third message
表格之间的关系是 messageID 字段。
我想要一个生成这样的结果的查询,其中我从表A中提取所有字段,以及表B中每条消息的注释数计数,如下所示:
messageID / Message / More... / CommentCount
1 / This is the first message / etc... / 0
2 / This is the second message / etc... / 2
3 / This is the third message / etc... / 1
我尝试过这样的事情:
SELECT tableA.*, count(commentID) as commentcount
FROM tableA LEFT JOIN tableB ON tableA.messageID = tableB.messageID GROUP BY messageID
但它不起作用。有任何想法吗?似乎应该可以在一个查询中执行此操作。我正在使用MSSQL。谢谢你的帮助。
答案 0 :(得分:13)
标量子查询将起作用:
SELECT tableA.*
,(SELECT count(commentID) FROM tableB WHERE tableA.messageID = tableB.messageID) as commentcount
FROM tableA
像往常一样,通过不同的性能配置文件,有很多方法可以为这只猫提供皮肤。
使用GROUP BY
时,输出中的所有列都需要位于GROUP BY
或聚合函数中 - 即使messageID中的其他列没有变化,它们仍然会需要在GROUP BY
。
答案 1 :(得分:4)
您可以使用相同的CTE。
;WITH CTE_MessageCount (MessageId, Count)
AS
(
SELECT MessageId, Count(*) FROM TableB GROUP BY MessageId
)
SELECT A.*, T.*
FROM tableA A JOIN CTE_MessageCount T ON A.messageID = T.MessageID
答案 2 :(得分:2)
尝试此查询:
SELECT a.*, b.msgCount
FROM tableA a LEFT JOIN
( SELECT messageID, COUNT(1) AS msgCount FROM tableB b GROUP BY messageID) b
ON a.messageID = b.messageID