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;
两种方案都能得到正确结果:
| id | name | ing | flav |
|---|---|---|---|
| abc | Creamy Chicken Soup | [{id: "def",name:"chicken"},{id:"ghi",name:"corn"},{id:"jkl",name:"pepper"}] | [{id:"mno",name:"spicy"}] |
内容的提问来源于stack exchange,提问作者Larry
相关产品推荐
相关产品推荐

