如何“子类化”PostgreSQL查询并合并多SUM查询以优化性能与可读性
一次性获取多类型统计结果的最优方案
当然可以!你想要的一次性拿到所有instance_type的数量总和,用条件聚合是最简洁高效的做法,比你尝试的多表连接写法靠谱多了——那种连接写法会产生不必要的笛卡尔积,既费性能还容易出统计错误。
直接看示例SQL吧,假设另外3种类型分别是return、exchange、transfer,你可以这样写:
SELECT SUM(CASE WHEN instance_type = 'sell' THEN quantity ELSE 0 END) AS sell_total, SUM(CASE WHEN instance_type = 'buy' THEN quantity ELSE 0 END) AS buy_total, SUM(CASE WHEN instance_type = 'return' THEN quantity ELSE 0 END) AS return_total, SUM(CASE WHEN instance_type = 'exchange' THEN quantity ELSE 0 END) AS exchange_total, SUM(CASE WHEN instance_type = 'transfer' THEN quantity ELSE 0 END) AS transfer_total FROM inventory_item;
为什么这个写法更好?
- 效率高:只需要扫描一次
inventory_item表,就能把所有类型的统计结果都算出来,比执行5次单独查询少了4次表扫描。 - 逻辑清晰:每个
CASE语句精准匹配对应的类型,只对符合条件的行累加quantity,不符合的就加0,结果一目了然。 - 避免错误:你原来尝试的多表连接写法(
FROM inventory_item a, b)是隐式交叉连接,会生成笛卡尔积(比如表有1000行的话,就会产生1000*1000=100万行数据),不仅慢,最后算出来的SUM值也会完全错误。
如果你的instance_type是动态的(比如未来可能新增类型),可以考虑用动态SQL生成这些聚合列,但如果是固定的5种类型,上面的静态条件聚合就是最佳选择。
内容的提问来源于stack exchange,提问作者Lorenzo Ang
相关产品推荐
相关产品推荐

