【发布时间】:2015-05-07 18:32:34
【问题描述】:
很难为我所需要的准确标题。
这围绕着 3 张桌子,是一个预约系统,我需要获取每个医生/护士的名单以及他们空闲的时间段。
我不想在下面的第一个 sql 中使用 UNION,这意味着我必须声明每个医生的姓名,我不想这样做。
表格...
用户详情:
ID Role Surname Clinic
1 Doctor House 1
2 Doctor Bob 1
3 Nurse Smith 1
4 Doctor Jim 2
5 Nurse Grant 2
6 Patient Billy 1
7 Patient Jones 1
时隙:
ID TimeSlot
1 10:00
2 10:30
3 11:00
4 11:30
11 16:30
12 17:00
约会:
ID StaffID PatientID TimeSlot AppDate
1 1 6 1 today
2 1 7 3 today
3 2 6 2 today
4 1 6 4 tomorrow
(StaffID 和 PatientID,是用户表中的外键 ID) 我需要一个查询,输出每个时间段和医生/护士,以了解他们今天(或基于“AppDate”的任何一天)没有预约的时间
我可以为特定的医生/护士这样做:
SELECT TimeSlots.TimeSlot, Users.Role, Users.Surname, Users.Clinic
FROM TimeSlots, Users
WHERE
TimeSlots.ID NOT IN
(SELECT Appointments.TimeSlot
FROM Appointments
INNER JOIN Users
ON Appointments.MedicalStaffID = Users.ID
WHERE AppDate = CONVERT(DATE,GETDATE()) AND Users.Surname = 'House')
AND
Users.Surname = 'House'
ORDER BY TimeSlots.TimeSlot;
这给了我:
TimeSlot Role Surname Clinic
10:30 Doctor House 1
11:30 Doctor House 1
16:30 Doctor House 1
17:00 Doctor House 1
这很好,但我需要 1 个查询来为所有医生/护士显示这个,所以我有:
TimeSlot Role Surname Clinic
10:30 Doctor House 1
11:30 Doctor House 1
16:30 Doctor House 1
17:00 Doctor House 1
10:00 Doctor Bob 1
11:00 Doctor Bob 1
11:30 Doctor Bob 1
16:30 Doctor Bob 1
17:00 Doctor Bob 1
所以也可以按时间订购。
我最初尝试使用:
SELECT TimeSlots.TimeSlot, Users.Role, Users.Surname, Users.Clinic
FROM TimeSlots, Users
WHERE
TimeSlots.ID NOT IN (SELECT TimeSlot FROM Appointments WHERE AppDate = GETDATE() AND (Users.Clinic = 'Werrington') AND (Users.Role = 'Doctor' OR Users.Role = 'Nurse'))
AND
(Users.Role = 'Doctor' OR Users.Role = 'Nurse')
AND
(Users.Clinic = 'Werrington')
ORDER BY TimeSlots.TimeSlot;
但这只会输出每个时隙的每个医生
在旁注中,我觉得有一种更好的方法来构建结果表的外观,但我想不出如何。
【问题讨论】:
标签: sql sql-server-2008 inner-join notin