Sql 找出医生预约的可用天数和时间
我有三张桌子:Sql 找出医生预约的可用天数和时间,sql,database,oracle11g,Sql,Database,Oracle11g,我有三张桌子: TimeSlot table having(TimeSlotId,TimeSlotStart,TimeSlotEnd,TimeSlotToken) AppointmentSchedule having (ApptId,DoctorId,TimeSlot1Id,TimeSlot2Id,TimeSlot3Id) Booking having (BookingId,DoctorId,PatientId,BookingDate,TimeSlotId) TimeSlotToken是医生在
TimeSlot table having(TimeSlotId,TimeSlotStart,TimeSlotEnd,TimeSlotToken)
AppointmentSchedule having (ApptId,DoctorId,TimeSlot1Id,TimeSlot2Id,TimeSlot3Id)
Booking having (BookingId,DoctorId,PatientId,BookingDate,TimeSlotId)
TimeSlotToken是医生在其时间段内看到的患者数量。
时间段1、2和3分别为上午、下午和晚上
我需要找到时隙未满的日期,即时隙令牌小于该特定日期和该时段的总预订量。因为每个医生每天可能有一个以上的时间段,所以我有麻烦。如果这三个时间段都是在某一天填写的,请向我显示我以后将使用的那些不可用的日期。并找出那些时间段未填满的日子的时间段和日期
要查找不可用的日期,我正在尝试以下代码:
with total_token(token) as (
select timeslottoken
from timeslot
where timeslotid=(select timeslot1id,timeslot2id,timeslot3id
from appointmentbooking
where doctor id=1001),
with token_as_day(bookingdate,token) as (
select bookingdate,count(distinct bookingid)
from bookings
where doctor_id=1001
group by booking_date,timeslot_id)
select token_as_day.bookingdate
from total_token,token_as_day
where token_as_day.token'<'total_token.token;
但这是行不通的。请帮忙!
注意-列名不区分大小写。我有更复杂的名字,我在这里简化了这些名字,因此区别就在这里。从评论到答案,以供参考——因为OP自己也得出了相同的解决方案
请在操作中查看:。您说您的代码不起作用。我猜你有错。但你没有告诉我们错误是什么。我脑子里突然冒出几个语法错误。当您有多个CTE时,您不需要重复with,只要x为…,y为。。。。total_令牌中的in语句选择了三列,并将其与一列进行比较,这将不起作用。显然,您的标准化表不正确。如果您不想修复数据模型,您可能需要在内部查询中使用多个union all语句。除@JustinCave提到的内容外,Total_标记中缺少右括号,医生id为空,预约日期、医生id和时隙id各有一个下划线,单引号表示预约日期,是为了什么安排的,还是病人打电话要求预约的那一天?@JustinCave我太傻了,竟然完全忽略了第二个“with”。另外,我没有在声明中选择three timeslotid,而是使用了其他内容。成功了。工作sql查询很大。但是它工作得很好…@Abecee做了以上的工作。此外,由于我隐藏了复杂的名称,我简化了它们,但存在不一致之处。因此出现了一些小错误。P.S-预订日期是确定约会的日期,,,,
WITH
Total_Token (timeSlotStart, token) AS (
SELECT
timeSlotStart, timeSlotToken
FROM TimeSlot
WHERE
timeSlotId IN (SELECT
timeSlot1Id
FROM AppointmentSchedule
WHERE doctorId = 1
UNION ALL
SELECT
timeSlot2Id
FROM AppointmentSchedule
WHERE doctorId = 1
UNION ALL
SELECT
timeSlot3Id
FROM AppointmentSchedule
WHERE doctorId = 1
)
),
Token_As_Day (bookingDate, token) AS (
SELECT
bookingDate, COUNT(DISTINCT bookingId)
FROM Booking
WHERE doctorId = 1
GROUP BY bookingDate, timeSlotId
)
SELECT
Token_As_Day.bookingDate
FROM Total_Token
JOIN Token_As_Day
ON TRUNC(Total_Token.timeSlotStart) = TRUNC(Token_As_Day.bookingDate)
AND Token_As_Day.token < Total_Token.token
;