避免在查詢中使用多個陣列聚合
在您的查詢中,您嘗試在單一查詢中使用多個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中文網其他相關文章!