SQL查询近3个月无付款记录交易订单的正确写法
问题根源
原查询存在两个核心错误:
- 表名写错:业务实际使用的交易核算表为
Transactions_accounting,原SQL查询的是transactions表,存在数据源错误风险 - 逻辑缺陷:仅筛选了
account_datetime <= '2022-03-24'且状态为成功的记录,没有排除后续存在成功付款记录的订单。比如订单9809995虽然在2022-03-24之前有对应记录,但上个月存在成功付款的入账记录,因此被误包含在结果中。
正确查询语句
查询核心逻辑是:圈定近3个月的订单范围,排除掉所有存在成功付款记录的订单,最终返回符合要求的order_id。
SELECT DISTINCT t.order_id FROM Transactions_accounting t WHERE -- 限定近3个月的时间范围,避免全表扫描 t.account_datetime >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH) -- 排除存在成功付款记录的订单 AND NOT EXISTS ( SELECT 1 FROM Transactions_accounting t2 WHERE t2.order_id = t.order_id AND t2.status = 'success' AND t2.account_datetime <= CURDATE() )
如果需要对齐你之前使用的固定查询基准日
2022-03-24,只需要把SQL中所有CURDATE()替换为'2022-03-24'即可,此时返回结果不会包含上月已付款的9809995,完全匹配预期结果。
性能优化建议
针对10万量级的数据,做两点优化即可保证查询效率:
- 给
order_id、status、account_datetime三个字段建立联合索引,避免全表扫描 - 优先使用
NOT EXISTS写法做排除判断,相比NOT IN不会因为字段空值导致结果异常,性能也更稳定
内容的提问来源于stack exchange,提问作者Bharath Kumar
相关产品推荐
相关产品推荐

