You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:56:39