MSSQL 2012:如何获取指定时段未出现在Appointments表中的Facilities数据
问题1:如何获取不匹配指定条件的数据行?
嘿,这个需求在日常SQL开发里太常见了!我给你拆解三种实用的实现方法,你可以根据场景选:
- 方法1:
NOT EXISTS子查询(推荐)
MSSQL对这种写法的执行计划优化做得很棒,性能稳定。核心逻辑是检查目标表中不存在符合匹配条件的记录。举个例子,找没有任何订单的客户:
SELECT * FROM Customers c WHERE NOT EXISTS ( SELECT 1 FROM Orders o WHERE o.CustomerID = c.CustomerID )
- 方法2:
LEFT JOIN+IS NULL
通过左连接把两张表关联,然后筛选出右表对应字段为NULL的行——这些就是左表中没匹配上右表的记录。还是用上面的场景:
SELECT c.* FROM Customers c LEFT JOIN Orders o ON o.CustomerID = c.CustomerID WHERE o.CustomerID IS NULL
- 方法3:
NOT IN(需注意坑点)
写法直观,但要警惕:如果子查询返回的结果包含NULL,NOT IN会直接返回空结果,所以必须过滤掉NULL值。例子:
SELECT * FROM Customers WHERE CustomerID NOT IN ( SELECT CustomerID FROM Orders WHERE CustomerID IS NOT NULL -- 必须加这个过滤,避免NULL导致的异常 )
问题2:MSSQL 2012中获取指定时间段内未出现在Appointments表的Facilities数据
结合你的表结构和需求,直接套用上面的方法就行,重点是加上时间段过滤条件。我给你写两种常用实现:
方式1:NOT EXISTS(逻辑清晰,性能优)
SELECT f.* FROM Facilities f WHERE NOT EXISTS ( SELECT 1 FROM Appointments a WHERE a.FacilityID = f.FacilityID -- 替换成你实际的时间段条件,比如预约起始时间在2024年1月内 AND a.AppointmentStartTime >= '2024-01-01' AND a.AppointmentStartTime < '2024-02-01' )
简单解释:遍历Facilities的每一行,检查指定时间段内Appointments表中有没有对应FacilityID的记录,没有的话就把这条设施数据选出来。
方式2:LEFT JOIN + IS NULL
如果你更习惯连接写法,这么做也可以:
SELECT f.* FROM Facilities f LEFT JOIN Appointments a ON a.FacilityID = f.FacilityID AND a.AppointmentStartTime >= '2024-01-01' AND a.AppointmentStartTime < '2024-02-01' WHERE a.FacilityID IS NULL
注意:时间段条件一定要写在ON子句里,要是写在WHERE里,左连接会变成内连接,结果就完全不对了。
内容的提问来源于stack exchange,提问作者user1591668
相关产品推荐
相关产品推荐

