sql where!=子句在其中什么都没有返回时不会产生任何结果



我有此SQL查询:

USE thr_clinic
GO
WITH CompleteSchedule AS (
    SELECT  U.ID as UserID, U.Role, U.Surname, U.Clinic, TS.ID as TimeSlotID, TS.TimeSlot
    FROM    Users U
        CROSS JOIN  TimeSlots TS
)
SELECT  CS.*
FROM    CompleteSchedule CS
    LEFT JOIN   Appointments A 
        ON A.MedicalStaffID = CS.UserID 
        AND A.TimeSlot = CS.TimeSlotID 
        AND A.AppDate = CONVERT(DATE,DATEADD(day, 3, GETDATE()))
WHERE   A.ID is null 
        AND CS.Role != 'Patient' 
        AND CS.Clinic = (SELECT Clinic FROM Users WHERE Users.ID = 1)
        AND CS.UserID != (SELECT StaffID FROM DaysOff WHERE DayOff = CONVERT(DATE,DATEADD(day, 3, GETDATE())))
ORDER BY    CS.UserID, CS.TimeSlotID

但是,使用WHEREORDER BY之前,如果返回为空的(这意味着没有人在给定的日期不关闭),则总查询尚无返回;但是,如果有结果(某人关闭),他们不会出现,其他所有人都会效果,而且效果很好。

我假设如果它返回空,则将显示所有人,因为 empty 不是 userId 无法显示。

,因为在Where子句中使用的子查询可能返回您可能不应该使用!=而不是not in的一个以上的值:

AND CS.UserID NOT IN (SELECT StaffID FROM DaysOff WHERE DayOff 

所以您想知道为什么子查询返回 NULL的位置没有排?因为NULL既不是=也不是<>其他任何东西。使用IS NULL

AND ((SELECT StaffID FROM DaysOff WHERE DayOff = CONVERT(DATE,DATEADD(day, 3, GETDATE() 
     IS NULL OR CS.UserID != (SELECT StaffID FROM DaysOff WHERE DayOff = CONVERT(DATE,DATEADD(day, 3, GETDATE()))))