9

给定

表 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

现在我只想从Table A.

这将不起作用:

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子句中(产生is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause错误)。

关键是要从这样的输出中移动

FkId  Count
1      42
2      25

像这样输出

FkId  Count  Name
1      42     Ronald
2      22     John

对于该错误消息,SO 上有很多匹配项,但有些例如https://stackoverflow.com/a/6456944/141172有诸如“将在表上生成 3 次扫描,而不是 1 次,因此不会缩放”。

如何在查询输出中有效地包含来自连接的字段Table B(与 1:1 的关系)?FkId

4

3 回答 3

12

你可以尝试这样的事情:

   ;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(公用表表达式)来处理您的分组/计数Table B,然后将该结果(每行FkId)加入并从最终结果集中Table A获取更多列。Table A

于 2012-07-06T20:43:04.810 回答
2

您是否尝试将字段添加到分组依据?

SELECT FkId, COUNT(FkId), a.Name
FROM B b
INNER JOIN A a ON a.Id=b.FkId
GROUP BY FkId,a.Name
于 2012-07-06T20:42:21.143 回答
0
select t3.Name, t3.FkId, t3.countedFkId from (a t1 
  join (select t2.FkId, count(FkId) as countedFkId from b t2 group by t2.FkId) 
  on t1.Id = t2.FkId) t3;
于 2012-07-06T20:48:31.233 回答