有多少B和C有A?

Tes*_*ent 6 sql database count

我有这个表:

A:
id
1
2

B:
id a_id
1  1
2  1
3  1

C:
id a_id
1  1
2  1
3  2
Run Code Online (Sandbox Code Playgroud)

我需要这个结果:

A, CountB, CountC
1,      3,      2
2,      0,      1
Run Code Online (Sandbox Code Playgroud)

这个尝试不起作用:

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
Run Code Online (Sandbox Code Playgroud)

如果不使用相关查询,sql句子必须如何?

Gor*_*off 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 
Run Code Online (Sandbox Code Playgroud)

然而,有些人(比如我自己)认为使用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
Run Code Online (Sandbox Code Playgroud)

仅计算,第一种形式是好的.如果您需要进行其他汇总(例如,汇总值),则通常需要拆分为组件查询.