SQL Server合并多查询:获取指定日期各房间占用信息及null值处理
解决方案
1. 用单条查询替代循环获取各房间对应记录
可以借助ROW_NUMBER()窗口函数按roomId分组,对符合条件的记录排序后取每组第一条,一次性返回所有房间的目标行,无需循环执行多次查询。
2. 处理dateFreed为NULL的场景
根据需求,当dateFreed为NULL(房间首次登记未释放)时需选中该行,我们可以在筛选条件中纳入dateFreed IS NULL,同时在排序时将NULL值优先排列,确保这类记录被选中。
最终SQL查询
WITH RankedSchedules AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY roomId ORDER BY CASE WHEN dateFreed IS NULL THEN 1 ELSE 0 END DESC, dateFreed DESC ) AS rn FROM schedule WHERE (dateFreed IS NULL OR dateFreed < [providedDate]) ) SELECT * FROM RankedSchedules WHERE rn = 1;
逻辑说明
- 分组排名:通过
PARTITION BY roomId将数据按房间分组,ROW_NUMBER()给每组内的记录编号;排序时先把dateFreed为NULL的记录排在最前,再按dateFreed倒序,保证每个房间的目标记录排名为1。 - 条件筛选:
(dateFreed IS NULL OR dateFreed < [providedDate])既覆盖了未释放的房间,也保留了原查询中“在指定日期前已释放”的记录逻辑。 - 结果提取:仅取每组排名为1的记录,即每个房间对应的目标行。
业务逻辑修正(可选)
如果你的核心需求是展示指定日期当天被占用的房间,原查询的dateFreed < [providedDate]逻辑可能偏差(会筛选出已释放的房间),正确的占用判断条件应为:
WHERE dateRegistered <= [providedDate] AND (dateFreed IS NULL OR dateFreed > [providedDate])
可根据实际业务场景调整。
内容的提问来源于stack exchange,提问作者Abraham Tellez
相关产品推荐
相关产品推荐

