我有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
答案 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;