6

私はこのテーブルを持っています:

A:
id
1
2

B:
id a_id
1  1
2  1
3  1

C:
id a_id
1  1
2  1
3  2

この結果が必要です:

A, CountB, CountC
1,      3,      2
2,      0,      1

この試みはうまくいきません:

SELECT 
    A.id, COUNT(B.id), COUNT(C.id)
FROM
    A
        LEFT JOIN
    B ON A.id = B.a_id
        LEFT JOIN
    C ON A.id = C.a_id
GROUP BY A.id

相関クエリを使用しない場合、SQL 文はどのようになりますか?

4

1 に答える 1

6

あなたの次のバリエーションが機能するはずです:

SELECT A.id, COUNT(distinct B.id), COUNT(distinct C.id)
FROM A LEFT JOIN
     B
     ON A.id = B.a_id LEFT JOIN
     C
     ON A.id = C.a_id
GROUP BY A.id 

ただし、count distinct を使用するのは危険だと感じる人 (私のような人) がいます。問題は、B からの行と C からの行が互いに干渉し合い、結合で乗算されることです。したがって、各結合を個別に実行してから、結果をまとめることもできます。

select ab.id, cntB, cntC
from (select a.id, count(*) as cntB
      from A left outer join
           B
           on A.id = B.a_id
      group by a.id
     ) ab join
     (select a.id, count(*) as cntC
      from A left outer join
           C
           on A.id = C.a_id
      group by a.id
     ) ac
     on ab.id = ac.id

カウントするだけなら、最初のフォームで問題ありません。他の要約 (値の合計など) を行う必要がある場合は、通常、コンポーネント クエリに分割する必要があります。

于 2012-08-09T19:48:17.803 に答える