SQL查询以查找从日期x到日期y的可用房间

SQL查询以查找从日期x到日期y的可用房间,sql,oracle,Sql,Oracle,在下面的关系模式中,我如何导出未从日期范围预订的可用基本类型的房间。这是我的照片。我在sqlplus中与oracle合作 SELECT * FROM ROOM r, BOOKING b WHERE NOT EXISTS (SELECT * FROM BOOKINGROOM br WHERE br.ROOMNO = r.ROOMNO AND br.BOOKINGID = b.BOOKINGID AND A

在下面的关系模式中,我如何导出未从日期范围预订的可用基本类型的房间。这是我的照片。我在sqlplus中与oracle合作

SELECT * 
    FROM ROOM r, BOOKING b
    WHERE NOT EXISTS
        (SELECT * FROM BOOKINGROOM br
         WHERE br.ROOMNO = r.ROOMNO 
         AND   br.BOOKINGID = b.BOOKINGID
         AND ARRIVEDATE < '01-FEB-2013'
         AND DEPARTDATE > '23-FEB-2013');

在下面的答案中,日期比较可能是一个问题

最简单的方法是:

SELECT DISTINCT r.* 
FROM Room r
LEFT JOIN BookingRoom br ON r.FloorNo = br.FloorNo AND r.RoomNo = br.RoomNo
LEFT JOIN Booking b ON br.BookingId = b.BookingId 
      AND (b.ArriveDate <= &end_range AND b.DepartDate >= &start_range)
WHERE b.BookingId IS NULL
  AND r.Type = 'BASIC';
如果绝对必须使用子查询,请尝试以下操作:

SELECT DISTINCT r.* 
FROM Room r
LEFT JOIN BookingRoom br ON r.FloorNo = br.FloorNo AND r.RoomNo = br.RoomNo
LEFT JOIN Booking b ON br.BookingId = b.BookingId 
WHERE (b.BookingId IS NULL OR b.BookingId NOT IN (
      SELECT BookingId 
      FROM Booking
      WHERE (ArriveDate <= &end_range AND DepartDate >= &start_range)
)) AND r.Type = 'BASIC';

尝试此查询,它将检测冲突的预订,无论它们是封闭的、封闭的还是与所需日期范围部分重叠的

SELECT DISTINCT r.* 
FROM Room r
LEFT JOIN BookingRoom br ON r.FloorNo = br.FloorNo AND r.RoomNo = br.RoomNo
LEFT JOIN Booking b ON br.BookingId = b.BookingId 
AND b.ArriveDate < &end_range AND b.DepartDate > &start_range 
WHERE b.BookingId IS NULL
AND r.Type = 'BASIC';

子查询是否可行?当然可以,但子查询的性能可能会较低。你为什么喜欢子查询?您可以将“ArriveDate”和“DepartDate”筛选器添加为“罐装”查询,而无需使用子查询。我发现子查询很难理解,因此非常希望使用此示例来理解。我理解“左入”很简单。你的意思是,你喜欢为了自己的回报而更加努力地工作吗;左联接是查找在请求范围内没有匹配项的项的最简单方法。上面的查询也不是固定查询。一个固定查询将有类似于arrivedate=&arrivedate的提示,而不是固定值。否:仍然显示预订房间,请参阅我在其中插入数据的方法booking@MooHa到达、离开和范围是什么日期?它列出了所有基本类型的房间。这并不是取消预订的房间。01房间基本类型的预订时间为2013年3月10日至2013年3月15日,给出的范围为2013年3月14日至2013年3月20日,但仍列出房间01@MooHa那么,我认为您的字段类型/日期比较有问题。检查一下这个SQL小提琴:非常奇怪,但问题是当我插入日期时,它是TO_date'03-JUL-1980','DD-MON-YYYY'结构
SELECT DISTINCT r.* 
FROM Room r
LEFT JOIN BookingRoom br ON r.FloorNo = br.FloorNo AND r.RoomNo = br.RoomNo
LEFT JOIN Booking b ON br.BookingId = b.BookingId 
AND b.ArriveDate < &end_range AND b.DepartDate > &start_range 
WHERE b.BookingId IS NULL
AND r.Type = 'BASIC';