複数列テーブルを使用したクエリ内の単一列を集計する
複数の列を含むクエリがあり、集計したい状況単一の特定の列を使用する場合、課題が生じる可能性があります。次のクエリについて考えてみましょう。
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
クエリは機能しますが、GROUP BY 句と ORDER BY 句の両方ですべての非集計フィールドをリストする必要があるため、冗長になります。この制約は、これらの句で集計が許可されていないために発生します。
幸いなことに、PostgreSQL 9.1 以降には、より簡単な解決策が存在します。主キーによるグループ化の概念を活用することで、クエリを大幅に簡素化できます。
SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ') FROM tbl1 GROUP BY 1 ORDER BY foo7, foo8; -- had to spell out, since no longer in select list!
ただし、クエリに複雑な関係を持つ複数のテーブルが含まれる場合は、別のアプローチを採用する方が効率的である可能性があります。最初に集計を実行してから結果を結合することで、クエリの非集計部分を最適化できます。
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 クエリ内の単一列を効率的に集計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。