无需使用UNION ALL合并多个SELECT语句的SQL查询简化方法
SQL查询简化方案
完全可以简化,原查询重复扫描了3次BUDGET表,所有公共过滤逻辑完全一致,仅Accnt表的匹配规则和求和系数有差异,可合并为单次查询实现相同逻辑,性能和可维护性都更好。
优化后代码
SELECT ISNULL(ROUND(SUM( CASE WHEN a.ID7 = 'EXPENSES' THEN signeddata WHEN a.ID7 = 'MERC' THEN signeddata * -1 WHEN a.ID11 = 'SYNP' THEN signeddata * -1 ELSE 0 END ),2),0) AS TOTAL FROM BUDGET b INNER JOIN Accnt a ON b.ACCOUNT = a.ID1 WHERE b.CATEGORY = 'ACTL' AND b.TIME BETWEEN '20210100' AND '20210800' AND b.CURRENCY = 'DOL' AND EXISTS ( SELECT 1 FROM DataSrc d WHERE d.ID1 = b.DATASRC AND d.ID7 = 'Logic' ) AND EXISTS ( SELECT 1 FROM Entity e WHERE e.ID1 = b.ENTITY AND e.ID9 = 'H2' ) AND (a.ID7 IN ('EXPENSES','MERC') OR a.ID11 = 'SYNP')
优化说明
- 减少表扫描次数:原查询需要扫描3次BUDGET表,优化后仅需扫描1次,数据量越大性能提升越明显
- 消除冗余代码:所有公共过滤条件仅需编写一次,后续调整参数时只需修改一处,避免多段相同逻辑漏改
- 逻辑更直观:通过CASE WHEN直接匹配不同账户类型对应的计算系数,无需拆分多个子查询再拼接求和
注意:如果Accnt表存在同一个ID1对应多条记录的情况,可将关联的Accnt表替换为
(SELECT DISTINCT ID1, ID7, ID11 FROM Accnt) a,避免重复计算BUDGET表数据。
内容的提问来源于stack exchange,提问作者Socramvm
相关产品推荐
相关产品推荐

