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

ここで、 から Name も出力したいだけです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 BYis 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には、「テーブルに 1 つではなく 3 つのスキャンが生成されるため、スケーリングされません」などのコメントがあります。 "。

結合された( と 1 対 1 の関係がある)からのフィールドをクエリ出力に効率的に含めるにはどうすればよいですか?Table BFkId

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 (Common Table Expression) を作成し、Table Bその結果 ( ごとに 1 行FkId) を結合して、Table Aさらにいくつかの列をTable A最終的な結果セットに取り込みます。

于 2012-07-06T20:43:04.810 に答える
2

フィールドを group by に追加しようとしましたか?

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 に答える