首页 > 数据库 > mysql教程 > 如何避免 PostgreSQL 中多个嵌套 `array_agg()` 调用产生意外结果?

如何避免 PostgreSQL 中多个嵌套 `array_agg()` 调用产生意外结果?

Barbara Streisand
发布: 2025-01-03 01:17:37
原创
292 人浏览过

How to Avoid Unexpected Results from Multiple Nested `array_agg()` Calls in PostgreSQL?

避免在 PostgreSQL 查询中使用多个嵌套聚合

单个查询中的多个 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

使用相关子查询或 JOIN 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:

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';
登录后复制

这些方法可以防止不必要的行重复并提供所需的数组聚合结果。

以上是如何避免 PostgreSQL 中多个嵌套 `array_agg()` 调用产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板