如何不用存储过程从年度源表中排除动态行数表的指定日期数据
实现方案
不需要使用存储过程,也不需要针对待剔除表的行数动态编写case when语句,以下是3种通用普通查询实现方式:
方法1:NOT EXISTS关联过滤(推荐,性能最优)
直接通过关联匹配排除符合剔除条件的记录,自动适配待剔除表的任意行数:
SELECT t1.* FROM 年度数据表 t1 WHERE NOT EXISTS ( SELECT 1 FROM 待剔除日期表 t2 WHERE t1.DISPLAY_NAME = t2.DISPLAY_NAME -- 替换下方日期字段为你两张表对应的实际日期字段名 AND t1.统计日期 = t2.待剔除日期 )
方法2:LEFT JOIN + 空值判断
逻辑更直观,和NOT EXISTS执行效率基本一致:
SELECT t1.* FROM 年度数据表 t1 LEFT JOIN 待剔除日期表 t2 ON t1.DISPLAY_NAME = t2.DISPLAY_NAME AND t1.统计日期 = t2.待剔除日期 -- 关联不上的就是不需要剔除的记录 WHERE t2.DISPLAY_NAME IS NULL
方法3:标记保留字段(适配需要先打标记再筛选的场景)
如果需要先给数据打保留/剔除标记再过滤,也不需要写多个case when,单次关联即可完成标记:
SELECT t1.*, CASE WHEN t2.DISPLAY_NAME IS NULL THEN 1 ELSE 0 END AS 保留标记 FROM 年度数据表 t1 LEFT JOIN ( -- 提前去重避免源表数据被关联重复 SELECT DISTINCT DISPLAY_NAME, 待剔除日期 FROM 待剔除日期表 ) t2 ON t1.DISPLAY_NAME = t2.DISPLAY_NAME AND t1.统计日期 = t2.待剔除日期 -- 如需直接获取保留数据,新增过滤条件 WHERE 保留标记 = 1 即可
表结构参考
- 源表示意图:

- 待剔除日期表示意图:

内容的提问来源于stack exchange,提问作者Yusuf Mert
相关产品推荐
相关产品推荐

