簡単なクエリ
これははるかに簡単になります 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
この場合、まったく役に立ちません。