2

次のリレーショナルスキーマでは、DATERANGEから予約されていない利用可能な「基本」タイプの部屋をどのように導き出すことができますか。これが私のショットです。私はsqlplusでオラクルを使用しています

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

日付の比較は、おそらく以下の回答で問題になっています。

4

2 に答える 2

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';
于 2013-03-18T20:19:26.327 に答える
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';
于 2013-03-18T21:35:21.670 に答える