48804


以下のように、tableAのIDに紐づくtableBがあります。  
これらのテーブルに対してtableAの結果全てと、tableAのIDに紐づいているtableBの件数を、下記希望取得結果のような形で取得できるSQLはあるでしょうか？  
現在の想定では、tableAの結果をループで回してtableBの件数を取得するしかないかなと考えています。

[code]

    tableA
    id | name
    ーーーーーーー
    1  | 山田太郎
    2  | 鈴木次郎
    3  | 田中三郎
    
    
    tableB
    id | tableA_id
    ーーーーーーー
    1  | 1
    2  | 1
    3  | 1
    4  | 3
    
    
    希望取得結果
    1  | 山田太郎 | 3
    2  | 鈴木次郎 | 0
    3  | 田中三郎 | 1
    
[/code]


CC BY-SA 4.0
2018-09-28T09:11:07.983
48789
2023-02-08T03:58:08.867
29367
question
sql
IDが紐づいている別テーブルのレーコード件数を取得したい

[code]

    select a.id, a.name, grouped_b.Counted
      from tableA a
      left join
      (select tableA_id, COUNT(id) AS Counted from tableB group by tableA_id) grouped_b
        ON a.id=b.tableA_id
    
[/code]


CC BY-SA 4.0
2018-09-28T10:39:48.593
48791
2018-09-28T10:39:48.593
25396
48789
answer


考え方ですがまず`tableB`をグループ化してカウントします。

[code]

    SELECT tableA_id, COUNT(*) FROM tableB GROUP BY tableA_id
    
[/code]

件数が得られます。

[code]

    1 | 3
    3 | 1
    
[/code]

`tableA`にこの結果を左結合します。

[code]

    SELECT id, name, cnt
    FROM tableA
    LEFT OUTER JOIN (SELECT tableA_id, COUNT(*) AS cnt FROM tableB GROUP BY tableA_id)
    ON id = tableA_id
    
[/code]

これで希望にかなり近い結果が得られます。

[code]

    1 | 山田太郎 | 3
    2 | 鈴木次郎 | NULL
    3 | 田中三郎 | 1
    
[/code]

左結合で結合されなかった行には`NULL`となるため、これを`0`にすれば希望する結果が得られます。

[code]

    SELECT id, name, COALESCE(cnt, 0)
    FROM tableA
    LEFT OUTER JOIN (SELECT tableA_id, COUNT(*) AS cnt FROM tableB GROUP BY tableA_id)
    ON id = tableA_id
    
[/code]


CC BY-SA 4.0
2018-09-29T01:24:28.117
48804
2018-09-29T01:24:28.117
4236
48789
answer


シンブルに `tableA` をベースに件数だけ副問合せします。  
`tableA` の件数が多くなければこれで十分です。

[code]

    select
      id,
      name,
      (
        select
          count(*)
        from
          tableB
        where
          tableB.tableA_id = tableA.id
      ) as count
    from
      tableA;
    
[/code]


CC BY-SA 4.0
2023-02-08T03:58:08.867
93762
2023-02-08T03:58:08.867
34583
48789
answer