SQL WHERE != 子句在 WHERE returns nothing 时没有结果
SQL WHERE != clause results in no results when the WHERE returns nothing
我有这个 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
但是,WHERE
就在 ORDER BY
之前,如果 returns 为空(意味着没有人在给定日期休息),则整个查询 returns没有什么;但如果有结果(有人离开),他们就不会出现,其他人都会出现,而且效果很好。
我假设如果它返回空那么它会向所有人显示,因为 empty 不是 userID 它无法显示。
所以您想知道为什么在子查询 returns 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()))))
由于 where 子句中使用的子查询可能 return 多个值,因此您可能不应该使用 !=
而是 not in
:
AND CS.UserID NOT IN (SELECT StaffID FROM DaysOff WHERE DayOff
我有这个 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
但是,WHERE
就在 ORDER BY
之前,如果 returns 为空(意味着没有人在给定日期休息),则整个查询 returns没有什么;但如果有结果(有人离开),他们就不会出现,其他人都会出现,而且效果很好。
我假设如果它返回空那么它会向所有人显示,因为 empty 不是 userID 它无法显示。
所以您想知道为什么在子查询 returns 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()))))
由于 where 子句中使用的子查询可能 return 多个值,因此您可能不应该使用 !=
而是 not in
:
AND CS.UserID NOT IN (SELECT StaffID FROM DaysOff WHERE DayOff