ホームページ >データベース >mysql チュートリアル >SQL クエリで複数の配列集計を使用するときに重複行を回避するにはどうすればよいですか?
クエリ内で複数の配列集計を使用しない
クエリで、単一のクエリ内で複数の 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 サイトの他の関連記事を参照してください。