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

複数の結合されたテーブルの集計関数

    SELECT f.id, f.name, b.fb_ct, t.tag_names
    FROM   foo f
    LEFT JOIN  (
        SELECT foo_id AS id, count(*) AS fb_ct
        FROM   foo_bar
        GROUP  BY 1
        ) b USING (id)
    LEFT JOIN  (
        SELECT target_id AS id, array_agg(name) AS tag_names
        FROM   tag
        GROUP  BY 1
        ) t USING (id)
    ORDER  BY f.id;
    

    望ましい結果を生み出します。

    • 明示的なJOINで書き直します 構文。読みやすく、理解しやすくなります(そしてデバッグしやすくなります)。

    • 複数の1:nに参加する 関連するテーブルでは、行が互いに乗算されてデカルト積 が生成されます。 -これは非常に高価なナンセンスです。意図しないCROSS JOIN プロキシによる。関連:

    • これを回避するには、最大で1つ参加します。 n -1へのテーブル -集計する前のテーブル(GROUP BY )。 2回集計することもできますが、nを集計する方がクリーンで高速です。 -個別にのテーブル それらを1に結合します -テーブル。

    • オリジナルとは対照的に(暗黙のINNER JOIN )。 LEFT JOINを使用しています fooから行が失われないようにするため foo_barに一致する行がない またはtag

    • 意図しないCROSS JOIN クエリから削除された場合、DISTINCTを追加する必要はありません。 これ以上-foo.idと仮定します ユニークです。




    1. sqlfiddleでストアドプロシージャを呼び出す方法は?

    2. Dockerコンテナ内のDjangoアプリがpostgresを見つけることができません

    3. psycopg2==2.6.2のインストール中にエラーが発生しました

    4. 関係属性をER図からSQLに変換する