特定
表A.
Id INTEGER Name VARCHAR(50)
表B.
Id INTEGER FkId INTEGER ; Foreign key to Table A
我想计算每个FkId值的出现次数:
SELECT FkId,COUNT(FkId) FROM B GROUP BY FkId
现在我只想输出表A中的Name.
这不起作用:
SELECT FkId,COUNT(FkId),a.Name FROM B b INNER JOIN A a ON a.Id=b.FkId GROUP BY FkId
因为a.Name不包含在GROUP BY子句中(生成在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句错误中).
重点是从这样的输出转移
FkId Count 1 42 2 25
输出像这样
FkId Count Name 1 42 Ronald 2 22 John
对于该错误消息,在SO上存在相当多的匹配,但是例如https://stackoverflow.com/a/6456944/141172有一些评论,如“将在桌面上产生3次扫描,而不是1,因此不会缩放”.
解决方法
你可以尝试这样的事情:
;WITH GroupedData AS ( SELECT FkId,COUNT(FkId) As FkCount FROM B GROUP BY FkId ) SELECT gd.*,a.Name FROM GroupedData gd INNER JOIN dbo.A ON gd.FkId = A.FkId
创建一个CTE(公用表表达式)来处理表B上的分组/计数,然后将该结果(每个FkId一行)连接到表A,并从表A中获取更多列到最终结果集中.