sql >> データベース >  >> RDS >> PostgreSQL

複数のテーブルから外部キーの数を取得する

    クエリにbの大部分が含まれる場合 および/またはc 最初に集約して後で結合する方が効率的です。
    これら2つのバリアントはかなり高速になると思います:

    SELECT a.id,
          ,COALESCE(b.ct, 0) + COALESCE(c.ct, 0) AS bc_ct
    FROM   a
    LEFT   JOIN (SELECT a_id, count(*) AS ct FROM b GROUP BY 1) b USING (a_id)
    LEFT   JOIN (SELECT a_id, count(*) AS ct FROM c GROUP BY 1) c USING (a_id);
    

    a_idの可能性を考慮する必要があります aにはまったく存在しません および/またはbcount() NULLを返すことはありません 、しかしそれはLEFT JOINに直面したときの寒い快適さです 、NULLが残ります それにもかかわらず、欠落している行の値。あなたはしなければならない NULLの準備 。 COALESCE()

    またはUNIONALLa_id 両方のテーブルから、集計し、次に 参加:

    SELECT a.id
          ,COALESCE(ct.bc_ct, 0) AS bc_ct
    FROM   a
    LEFT   JOIN (
       SELECT a_id, count(*) AS bc_ct
       FROM (
          SELECT a_id FROM b
          UNION ALL
          SELECT a_id FROM c
          ) bc
       GROUP  BY 1
       ) ct USING (a_id);
    

    おそらく遅い。しかし、これまでに提示されたソリューションよりもまだ高速です。そして、COALESCE()なしで行うことができます それでも行を失うことはありません。ときどきNULLが表示される場合があります bc_ctの値 、この場合。



    1. 表データのXMLを生成するSQL

    2. MySQLに`connectby`の代替手段はありますか?

    3. postgresqlのwhere句の列エイリアスにアクセスします

    4. mysql列の「適切なケース」のフォーマットを行う方法は?