You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL多表连接后JSON_AGG结果重复问题求解

解决PostgreSQL多数组关联查询的聚合重复问题

你的问题出在多表关联时产生了笛卡尔积:当meal与ingredient关联后得到3条记录(对应3种食材),再与flavor关联时,每条食材记录都会匹配到同一种口味,最终生成3条包含相同口味的记录,聚合后自然出现重复的口味项。

下面提供两种无需修改表结构的解决方案:

方案1:独立聚合子查询(推荐,从根源避免重复)

分别对食材和口味做独立的聚合查询,再与主表关联,彻底避开笛卡尔积问题:

SELECT
    m.id,
    m.name,
    ing.ing,
    flav.flav
FROM meal m
LEFT JOIN (
    SELECT
        meal.id,
        JSON_AGG(i) AS ing
    FROM meal
    LEFT JOIN ingredient i ON i.id = ANY(meal.ingredients)
    GROUP BY meal.id
) ing ON ing.id = m.id
LEFT JOIN (
    SELECT
        meal.id,
        JSON_AGG(f) AS flav
    FROM meal
    LEFT JOIN flavor f ON f.id = ANY(meal.flavors)
    GROUP BY meal.id
) flav ON flav.id = m.id;

方案2:聚合时直接去重

如果场景简单(口味/食材本身无重复项),可以直接在JSON_AGG中加入DISTINCT关键字快速去重:

SELECT
    meal.id,
    meal.name,
    JSON_AGG(DISTINCT i) AS ing,
    JSON_AGG(DISTINCT f) AS flav
FROM meal
LEFT JOIN ingredient i ON i.id = ANY(meal.ingredients)
LEFT JOIN flavor f ON f.id = ANY(meal.flavors)
GROUP BY meal.id, meal.name;

两种方案都能得到正确结果:

idnameingflav
abcCreamy Chicken Soup[{id: "def",name:"chicken"},{id:"ghi",name:"corn"},{id:"jkl",name:"pepper"}][{id:"mno",name:"spicy"}]

内容的提问来源于stack exchange,提问作者Larry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:55:17