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

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

为什么这能解决问题:

  1. WHERE子句先过滤出我们需要的branch code字段,避免处理无关数据
  2. ARRAY_AGG()会自动为每个items.name分组,收集该分组对应的所有field_values.value,生成对应的数组
  3. 如果你的数据里存在重复的分支代码,可以加上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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:19:07