SQL如何获取与给定条件不匹配的行

时间:2018-02-23 17:08:51

标签: sql sql-server-2012

我有2张桌子设施和约会。两个表共享一个共同列 FacilityID 。如何从Facility表中获取不在约会条件中的行...这是我的sql。我希望在该时间段内从Facility表中获取不在Appointment表中的Facilities。我正在使用MSSQL 2012

SELECT A.FacilityID,A.ApptDateTime 
From Appointment A 
WHERE 
    A.FacilityID Not In(SELECT F.FacilityID FROM Facility F WHERE F.FacilityID = A.FacilityID) 
    and
    A.ApptDateTime  between '2-19-2018' and '2-23-2018'  
order by A.FacilityID

2 个答案:

答案 0 :(得分:2)

反转内部和外部查询:

SELECT FacilityID FROM Facility
WHERE FacilityID NOT IN (
    SELECT FacilityID
    FROM Appointment
    WHERE ApptDateTime BETWEEN '2-19-2018' AND '2-23-2018
    -- AND FacilityID IS NOT NULL /* be careful if this is nullable */
)
ORDER BY FacilityID;

如果通过在连接条件内部进行过滤来指定缩小连接的范围,也可以使用外连接:

SELECT F.FacilityID
FROM Facility F LEFT OUTER JOIN Appointment A
    ON     A.FacilityID = F.FacilityID
       AND ApptDateTime BETWEEN '2-19-2018' AND '2-23-2018
ORDER BY F.FacilityID;

答案 1 :(得分:1)

使用not exists或相关子查询,而不是两者:

SELECT A.FacilityID, A.ApptDateTime 
FROM Appointment A 
WHERE NOT EXISTS (SELECT 1
                  FROM Facility F
                  WHERE F.FacilityID = A.FacilityID
                 ) AND
      A.ApptDateTime BETWEEN '2018-02-19' and '2018-02-23'  
ORDER BY A.FacilityID;