如何在WITH子句中用MAX获取单值并在主查询中做空值校验及性能优化
没问题,我帮你调整出符合要求的高效SQL写法,完全适配你的两个场景需求!
解决方案
核心需求回顾
- 场景1:当
monthly_data存在数据时,统计daily_data中日期晚于monthly_data最大日期的data总和 - 场景2:当
monthly_data无数据时,统计daily_data所有行的data总和 - 要求采用高效的CTE形式,适合写入存储过程
优化后的SQL语句
WITH CTE AS ( SELECT MAX(some_date) AS latest_dt FROM monthly_data ) SELECT SUM(d.data) AS total_sum FROM daily_data d CROSS JOIN CTE c WHERE d.some_date > c.latest_dt OR c.latest_dt IS NULL;
逻辑拆解
- CTE部分:只执行一次聚合查询,拿到
monthly_data里最新的some_date;如果表是空的,MAX()会返回NULL,刚好覆盖无数据的场景。 - 关联与过滤:用
CROSS JOIN关联daily_data和CTE——因为CTE永远只有1行数据,所以不会产生多余的笛卡尔积,性能几乎没损耗。然后通过WHERE条件精准触发两个场景:- 当
latest_dt有值时,只筛选daily_data中日期更大的记录 - 当
latest_dt为NULL时,所有daily_data记录都被纳入统计
- 当
案例验证
- Case 1:monthly_data存在数据
CTE返回latest_dt = '08-MAY-2018',过滤后只有09-MAY-2018的记录符合条件,最终SUM(data)结果为1,和预期一致。 - Case 2:monthly_data无数据
CTE返回latest_dt = NULL,OR条件触发所有记录被统计,SUM(data)结果为3,完全符合需求。
性能说明
这个写法非常高效,适合存储场景:
- CTE的聚合查询成本极低,只扫描
monthly_data一次 - 关联操作是单行匹配,不会增加额外的计算负担
- 如果
daily_data.some_date建有索引,d.some_date > c.latest_dt的过滤可以直接利用索引加速,进一步提升查询效率
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

