4

クエリに他の多くの列がある場合、単一の列を集計する適切な方法はありますか?

私はこの回答を試しましたが、私のクエリはより冗長になりました。

私の現在のクエリは次のようになります。

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 ビット

4

2 に答える 2

1

主な問題がフィールド (foox) が計算されることである場合、これが役立ちます。

SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ')
FROM tbl1
GROUP BY 1, 2, 3, 4, 5, 6
ORDER BY 5, 6

これら1, 2...は、選択リストに表示される順序のフィールドです。

于 2013-04-15T15:08:23.803 に答える