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

多くの列を持つクエリで単一の列を集約します

    簡単なクエリ

    これははるかに簡単になります PostgreSQL9.1以降の場合 。この密接に関連する回答で説明されているように:

    • PGError:エラー:オブジェクトとそのhas_manyオブジェクトのARクエリのWHERE句で集計は許可されていません

    GROUP BYで十分です 主キー テーブルの。以来:

    foo1は主キーです

    ..例を次のように簡略化できます:

    SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ')
    FROM   tbl1
    GROUP  BY 1
    ORDER  BY foo7, foo8;  -- have to be spelled out, since not in select list!
    

    複数のテーブルを使用したクエリ

    ただし、次のような理由があります:

    さらに多くのフィールドとLEFTJOIN、重要な部分は、これらすべてのフィールドが1対1または1対0の関係にあることです。ただし、1対nの1つのフィールドを集約します

    .. 最初に集約し、後で参加する方が速くて簡単なはずです :

    SELECT t1.foo1, t1.foo2, ...
         , t2.bar1, t2.bar2, ...
         , a.aggregated_col 
    FROM   tbl1 t1
    LEFT   JOIN tbl2 t2 ON ...
    ...
    LEFT   JOIN (
       SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col
       FROM   agg_tbl a ON ...
       GROUP  BY some_id
       ) a ON a.some_id = ?.some_id
    ORDER  BY ...
    

    このように、クエリの大部分は集計をまったく必要としません。

    私は最近、SQL Fiddleでテストケースを提供して、この関連する回答の要点を証明しました。

    • PostgreSQL-配列による順序付け

    この関連する回答を参照しているので:いいえ、DISTINCT この場合、まったく役に立ちません。



    1. ストアドプロシージャの列名とタイプを取得しますか?

    2. JavaFXテーブルを使用してデータを整理する

    3. PostgreSQLでのpg_sleep_until()のしくみ

    4. 変数を割り当てるときのSETとSELECT?