PostgreSQL中如何使用GROUP BY子句获取关联表列的值?
问题分析与解决方案
你的问题出在子查询没有和外层的分组记录关联,导致它返回了所有符合fields.name = 'branch code'的field_values.value,而不是当前分组对应item的value。我给你两种解决思路:
方案一:使用聚合函数ARRAY_AGG()(推荐)
这是最简洁高效的方式,PostgreSQL的ARRAY_AGG()可以直接在分组时将对应字段的值聚合为数组:
SELECT items.name, SUM(items.quantity) AS quantity, ARRAY_AGG(field_values.value) AS "delivery_to_branches" FROM items INNER JOIN field_values ON field_values.item_id = items.id INNER JOIN fields ON field_values.field_id = fields.id WHERE fields.name = 'branch code' -- 先过滤出目标字段类型,减少计算量 GROUP BY items.name
为什么这能解决问题:
WHERE子句先过滤出我们需要的branch code字段,避免处理无关数据ARRAY_AGG()会自动为每个items.name分组,收集该分组对应的所有field_values.value,生成对应的数组- 如果你的数据里存在重复的分支代码,可以加上
DISTINCT去重:ARRAY_AGG(DISTINCT field_values.value)
方案二:修正子查询的关联逻辑
如果你坚持要用子查询的方式,需要让子查询关联外层当前分组的items.id,而不是查询所有item的id:
SELECT items.name, SUM(items.quantity) AS quantity, ARRAY( SELECT field_values.value FROM field_values WHERE field_values.item_id = items.id -- 关联外层当前item的id,确保只取当前分组的value AND field_values.field_id = (SELECT id FROM fields WHERE name = 'branch code') ) AS "delivery_to_branches" FROM items GROUP BY items.name
原查询的问题点:
你原来的子查询里用了field_values.item_id IN ( SELECT ID FROM items ),这会匹配所有item的id,所以不管当前分组是noodles、biscuits还是papers,子查询都会返回所有分支代码的value,导致所有分组的数组内容完全一致。
内容的提问来源于stack exchange,提问作者siv rj
相关产品推荐
相关产品推荐

