ホームページ >データベース >mysql チュートリアル >SQL クエリで複数の配列集計を使用するときに重複行を回避するにはどうすればよいですか?

SQL クエリで複数の配列集計を使用するときに重複行を回避するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-30 07:34:09331ブラウズ

How to Avoid Duplicate Rows When Using Multiple Array Aggregates in a SQL Query?

クエリ内で複数の配列集計を使用しない

クエリで、単一のクエリ内で複数の array_agg() 関数を使用しようとしています。異なるテーブルから配列を取得します。ただし、この方法では行が重複し、結果が歪められます。

問題

複数の結合や集計関数を実行すると、結果セットが重複で増大する可能性があります。あなたの場合、住所テーブルと営業日テーブルを結合すると、従業員ごとに複数の行が作成され、その結果、集計配列に重複したエントリが作成されます。

解決策: 集計と結合を個別に行う

この問題を解決するには、結合プロセスから集計操作を分離することをお勧めします。次のアプローチを検討してください:

最初に集計し、後で結合:

まず、サブクエリを使用して各テーブルのデータを個別に集計します。次に、主キーまたは共通列に基づいて集計結果を結合します:

SELECT e.id, e.name, e.age, e.streets, array_agg(wd.day) AS days
FROM (
   SELECT e.id, e.name, e.age, array_agg(ad.street) AS streets
   FROM   employees e
   JOIN   address  ad ON ad.employeeid = e.id
   GROUP  BY e.id
   ) e
JOIN   workingdays wd ON wd.employeeid = e.id
GROUP  BY e.id, e.name, e.age;

相関サブクエリまたは JOIN LATERAL:

データの選択的フィルタリングについては、以下を考慮してください。相関サブクエリまたは LATERAL 結合を使用するPostgreSQL:

相関サブクエリ:

SELECT name, age
    , (SELECT array_agg(street) FROM address WHERE employeeid = e.id) AS streets
    , (SELECT array_agg(day) FROM workingdays WHERE employeeid = e.id) AS days
FROM   employees e
WHERE  e.namer = 'peter';

JOIN LATERAL (PostgreSQL 9.3 以降):

SELECT e.name, e.age, a.streets, w.days
FROM   employees e
LEFT   JOIN LATERAL (
   SELECT array_agg(street) AS streets
   FROM   address
   WHERE  employeeid = e.id
   GROUP  BY 1
   ) a ON true
LEFT   JOIN LATERAL (
   SELECT array_agg(day) AS days
   FROM   workingdays
   WHERE  employeeid = e.id
   GROUP  BY 1
   ) w ON true
WHERE  e.name = 'peter';

これらのアプローチにより、集約された配列が対応する従業員に正しく関連付けられるようになります。期待される結果。

以上がSQL クエリで複数の配列集計を使用するときに重複行を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。