Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 找出医生预约的可用天数和时间_Sql_Database_Oracle11g - Fatal编程技术网

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
;