避免在查询中使用多个数组聚合
在您的查询中,您尝试在单个查询中使用多个 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中文网其他相关文章!