SQL Server 子查询多日期范围EXISTS校验 不使用UNION单查询实现
实现方案
你可以通过CTE预定义所有待统计的日期范围,再配合交叉关联实体表 + EXISTS校验的逻辑实现需求,完全不需要使用UNION拼接多段查询,也符合必须使用EXISTS做存在性判断的业务要求。
完整查询代码
-- 沿用你原有的变量定义即可 DECLARE @FortnightStart DATETIME = '2020/08/01', @FortnightEnd DATETIME = '2020/08/14 23:59:59' DECLARE @QuarterStart DATE = '2020/04/01', @QuarterEnd DATE = '2020/06/30 23:59:59' WITH DateRanges AS ( -- 预定义所有需要统计的日期范围,新增范围只需在此处添加条目 SELECT 'Fortnight' DateRange, @FortnightStart RangeStart, @FortnightEnd RangeEnd UNION ALL SELECT 'Quarter' DateRange, @QuarterStart RangeStart, @QuarterEnd RangeEnd ) SELECT e.EntityId, dr.DateRange, e.EntityName FROM #Entity e -- 生成所有「实体 + 日期范围」的待校验组合 CROSS JOIN DateRanges dr WHERE EXISTS ( SELECT 1 FROM #EntityDate d WHERE d.EntityId = e.EntityId AND d.SubmittedDate BETWEEN dr.RangeStart AND dr.RangeEnd ) ORDER BY dr.DateRange, e.EntityId
逻辑说明
- 先用CTE统一管理所有需要统计的日期范围,后续新增统计周期不需要修改核心逻辑,只需在CTE中新增对应条目即可
- 通过CROSS JOIN将实体表和日期范围表做笛卡尔积,得到所有需要校验的「实体+日期范围」组合
- 最后通过要求的EXISTS子句做过滤:仅保留该实体在对应日期范围内存在提交记录的组合,最终输出结果和你给出的预期输出完全一致
- 全程仅执行单次查询,没有使用UNION拼接多段查询结果,完全符合需求
内容的提问来源于stack exchange,提问作者SK-USA
相关产品推荐
相关产品推荐

