ホームページ > データベース > mysql チュートリアル > 複数列 SQL クエリ内の単一列を効率的に集計するにはどうすればよいですか?

複数列 SQL クエリ内の単一列を効率的に集計するにはどうすればよいですか?

DDD
リリース: 2024-12-16 22:09:18
オリジナル
146 人が閲覧しました

How Can I Efficiently Aggregate a Single Column in a Multi-Column SQL Query?

複数列テーブルを使用したクエリ内の単一列を集計する

複数の列を含むクエリがあり、集計したい状況単一の特定の列を使用する場合、課題が生じる可能性があります。次のクエリについて考えてみましょう。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート