有效地包含不在SQL查询的Group By中的列

前端之家收集整理的这篇文章主要介绍了有效地包含不在SQL查询的Group By中的列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
特定

表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,因此不会缩放”.

如何在查询输出中有效地包含联接表B中的字段(与FkId具有1: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中获取更多列到最终结果集中.

原文链接:https://www.f2er.com/mssql/83657.html

猜你在找的MsSQL相关文章