クエリに他の多くの列がある場合、単一の列を集計する適切な方法はありますか?
私はこの回答を試しましたが、私のクエリはより冗長になりました。
私の現在のクエリは次のようになります。
SELECT t1.foo1, t1.foo2, t2.foo3, t2.foo4, string_agg(t3.aggregated_field, ', ')
FROM tbl1 t1
LEFT JOIN tbl2 t2 ON t1.id = t2.fkeyid
LEFT JOIN tbl3 t3 ON t2.id = t3.fkeyid
GROUP BY t1.foo1, t1.foo2, t2.foo3, t2.foo4, t2.foo5, t2.foo6
ORDER BY t2.foo5, t2.foo6
クエリにはさらに多くのフィールドと があります。重要な部分は、上記の疑似クエリLEFT JOIN
で表される、集計したい 1 対 n の 1 つのフィールドを除いて、これらすべてのフィールドに 1 対 1 または 1 対 0 の関係があることです。t3.aggregated_field
SELECT
集計関数を使用しているため、 andにリストされているすべてのフィールドは、ORDER BY
集計されるか、GROUP BY
句の一部である必要があります。これにより、クエリが以前よりも冗長になります。
つまり、foo1
が主キーであると仮定すると、このフィールドが繰り返されると、他のすべてのフィールドaggregated_field
も等しくなります。これらの繰り返される行を、集計されたフィールド値を含む単一行の結果として取得したいと考えています。(基本的にselect distinct
は集計列を使用)
これを行うより良い方法はありますか (他のすべてのフィールドを に配置するGROUP BY
必要はありません)、またはこの 1 対 n の関係をフェッチする各行に対してクエリを実行するバックエンドで結果セットを反復処理する必要がありますか?
サーバーは PostgreSQL 9.1.9 を実行しています。具体的には、次のとおりです。
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54) でコンパイルされた x86_64-unknown-linux-gnu 上の PostgreSQL 9.1.9、64 ビット