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

PostgreSQL多表连接时金额求和与子表计数异常问题解决

解决关联查询中金额求和与子表计数冲突的问题

问题核心是关联查询会导致父表记录被重复计算,而分组子表又丢失了子表的实际行数,可以通过以下两种方法解决:

方法一:独立子查询分别计算

直接分开统计父表的金额总和,以及符合条件的子表总记录数,避免关联带来的干扰:

SELECT
    (SELECT SUM(amount) FROM parent WHERE year = 2020) AS total_parent_amount,
    (SELECT COUNT(*) FROM child WHERE parent_id IN (SELECT id FROM parent WHERE year = 2020)) AS total_child_count;

该查询会直接返回正确结果:total_parent_amount=1300,total_child_count=4。

方法二:关联时先统计子表分组行数

先对子表按父ID分组统计每条父ID对应的子记录数,再与父表关联汇总:

SELECT
    SUM(p.amount) AS total_parent_amount,
    SUM(child_count) AS total_child_count
FROM parent p
LEFT JOIN (
    SELECT parent_id, COUNT(*) AS child_count
    FROM child
    GROUP BY parent_id
) c ON c.parent_id = p.id
WHERE p.year = 2020;

这里子表先完成分组统计,父表每条记录仅关联一次,既保证了金额求和的准确性,又能通过求和子表分组行数得到总记录数。

原方法出错原因

  • 第一个查询用LEFT JOIN后,父ID为101的记录被关联出3条子表记录,导致SUM(p.amount)重复计算3次300,最终结果为1900,不符合预期。
  • 第二个查询的子表用GROUP BY parent_id后,仅保留每个父ID的一条记录,COUNT(c)统计的是有子表关联的父ID数量(2个),而非子表总记录数(4条)。

内容的提问来源于stack exchange,提问作者Murat Yıldız

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:50:10