2013-03-18 48 views
2

在以下關係模式中,如何導出未從日期範圍預訂的房間的可用「基本」類型。這是我的鏡頭。我在sqlplusSQL查詢從日期x到日期y查找可用房間y

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'); 

與甲骨文合作我也想被「罐裝查詢」查詢,所以我手動添加結束範圍,開始日期範圍。子查詢答案將是首選。

INSERT INTO BOOKING VALUES (2314, 1001, TO_DATE('10-MAR-2013', 'DD-MON-YYYY'), TO_DATE('15-MAR-2013', 'DD-MON-YYYY'), 1225.00); 

日期比較問題可能在下面的答案。

回答

2

最簡單的方法是:

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'; 
+0

ISIT可能的子查詢? – MooHa 2013-03-18 20:19:58

+0

當然,但子查詢可能性能較差。任何你喜歡子查詢的理由?您可以將'ArriveDate'和'DepartDate'過濾器添加爲'canned'查詢,而無需使用子查詢。 – PinnyM 2013-03-18 20:20:25

+0

我發現子查詢很難理解,所以真的很想用這個例子來理解。左加入我明白很簡單。 – MooHa 2013-03-18 20:21:18

1

嘗試此查詢,無論是封閉,這將檢測衝突的預訂,封閉通過或部分與期望的日期範圍重疊。

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'; 
+0

nope :(預訂房間仍顯示,請參閱我的數據插入方式預訂 – MooHa 2013-03-18 21:41:54

+0

@MooHa預訂哪些日期(抵達,出發和範圍)? – 2013-03-18 21:49:58

+0

它列出了BASIC類型的所有房間,它並沒有消除預訂的房間ROOM 01(BASIC TYPE)預訂時間爲2013年3月10日至15日2013年3月,範圍是2013年3月14日至2013年3月20日,但它仍然列出了房間01 – MooHa 2013-03-18 21:53:35