首页 >数据库 >mysql教程 >在 SQL 查询中使用多个数组聚合时如何避免重复行?

在 SQL 查询中使用多个数组聚合时如何避免重复行?

Patricia Arquette
Patricia Arquette原创
2024-12-30 07:34:09336浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn