首頁 > 資料庫 > mysql教程 > 在 SQL 查詢中使用多個陣列聚合時如何避免重複行?

在 SQL 查詢中使用多個陣列聚合時如何避免重複行?

Patricia Arquette
發布: 2024-12-30 07:34:09
原創
329 人瀏覽過

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:

對於資料的選擇性過濾,請考慮在PostgreSQL中使用相關子查詢或LATERAL連接:

相關子查詢:

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板