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
相关产品推荐
相关产品推荐

