Postgres中如何跨多个相同表实现求和与分组查询?
解决方案:用UNION ALL合并表后直接聚合
你需要的是用UNION ALL将三个表的所有记录合并成一个逻辑上的单一数据集,然后直接对这个合并后的数据集进行分组求和,这比你之前的方法更简洁高效,也更易扩展。
具体查询语句
SELECT user_id, SUM(amount) AS total_amount FROM ( SELECT user_id, amount FROM purchases1 UNION ALL SELECT user_id, amount FROM purchases2 UNION ALL SELECT user_id, amount FROM purchases3 ) AS combined_purchases GROUP BY user_id;
为什么这比你的原方法更好?
- 更简洁:不需要先对每个表单独聚合,再在外层二次求和,逻辑更直接。
- 性能更优:
UNION ALL不会像UNION那样做去重操作(你的场景里不同表的购买记录都是独立的,不需要去重),减少了不必要的计算开销。 - 扩展性强:如果后续增加更多同结构的表(比如purchases4、purchases5),只需要在子查询里继续添加
UNION ALL SELECT user_id, amount FROM purchasesN即可,维护成本低。
补充优化方案
如果你的数据库支持(比如PostgreSQL、MySQL 8.0+),可以创建一个视图来封装三个表的合并逻辑,之后查询视图就像查询单个表一样:
CREATE VIEW all_purchases AS SELECT user_id, amount FROM purchases1 UNION ALL SELECT user_id, amount FROM purchases2 UNION ALL SELECT user_id, amount FROM purchases3;
之后查询总金额就可以简化为:
SELECT user_id, SUM(amount) AS total_amount FROM all_purchases GROUP BY user_id;
这样如果后续表有增减,只需要修改视图定义,不需要修改每个聚合查询。
内容的提问来源于stack exchange,提问作者Cloud Artisans
相关产品推荐
相关产品推荐

