2016-12-07 8 views
0

私はホテル管理システムを構築しています。指定された日付に利用可能な部屋を見つけることに固執しています。私は2つのテーブル、すなわち部屋と予約Derby組み込みデータベースから部屋を得る方法

Rooms Table 
| RoomID | Name | Floor | Bed | Rent | RoomType| 

Reservation Table 
| ResvID | RoomId | CheckIn | CheckOut | CustomerID | 

を持っており、予約テーブルの外部キーはRoomIdです。

私が欲しいのは、利用可能な部屋を取得することです(指定された日付には予約されていません)。私のアプリケーションには、新しい部屋を追加する機能もあります。予約テーブルに参加するだけで、新しい部屋が決して予約テーブルにないため、希望の結果が得られませんでした。私はまた、BedTypeとRoomTypeでフィルタリングしたい。次のクエリを使用しました。

SELECT DISTINCT r.RoomID, r.RoomNo, r.Name, r.Floor, r.RoomType, r.Rent 
FROM hms.rooms r 
JOIN hms.reservation rv 
    ON r.RoomID = rv.ROOM_ID 
WHERE (((rv.CHECKIN < ? AND --Checkin Provided 
     rv.CHECKOUT <= ?) OR --Checkin Provided 
     (rv.CHECKIN >= ? AND --Checkout Provided 
     rv.CHECKOUT > ?)) AND --Checkout Provided 
     rv.CHECKIN <> ? AND rv.CHECKOUT <> ?) AND -- Checkin/Checkoutprovided 
     (r.RoomType = ? AND --RoomType provided 
     r.Bed = ?) --BedType provided 
    UNION 
    SELECT RoomID, RoomNo, Name, Floor, RoomType, Rent 
    FROM hms.rooms AS r WHERE r.RoomID NOT IN(
    SELECT ROOM_ID FROM hms.reservation) AND 
(r.RoomType = ? AND r.Bed = ?) --Room?BedType provided 

このクエリは機能しません。それは常に部屋を示しています。

編集:いくつかのサンプルデータを提供し、期待どおりの結果がどうあるべきか失敗していると何を指摘してください。このコードが、利用可能な

SELECT RoomID, RoomNo, Name, Floor, RoomType, Rent 
    FROM hms.rooms r 
WHERE r.RoomID NOT IN 
(SELECT ROOM_ID 
    FROM hms.reservation rv 
    WHERE(
     ((rv.CHECKIN <= ?) AND --in 
     (rv.CHECKOUT > ? AND rv.CHECKOUT < ?)) OR --in/out 

     ((rv.CHECKIN < ? AND rv.CHECKIN > ?) AND --out/in 
     (rv.CHECKOUT >= ?)) OR --out 

     (rv.CHECKIN > ? AND rv.CHECKOUT < ?) OR --in/out 

     (rv.CHECKIN = ? AND rv.CHECKOUT = ?) OR --in/out 

     (rv.CHECKIN < ? AND rv.CHECKOUT > ?) --in/out 

    ) AND 

    (r.RoomType = ? AND r.Bed = ?) 

答えて

0

としてそのそれでも示す部屋を試してみました。私が正しく理解していれば、指定されたチェックインチェックアウト期間中、いつでも予約されていない部屋を見つけようとしています。たぶん、このような何か:

SELECT RoomID, RoomNo, Name, Floor, RoomType, Rent 
    FROM hms.rooms r 
    WHERE r.RoomID NOT IN (SELECT ROOM_ID 
          FROM hms.reservation rv 
          WHERE rv.CHECKIN < :p_checkout 
          AND rv.CHECKOUT > :p_checkin 
         ) 
    AND r.RoomType = :p_room_type AND r.Bed = :p_bed_type 

つまりは、私のチェックアウト前に開始した予約(:p_checkout)がある場合と(:p_checkin)私のチェックインの前に完了しない場合、利用可能なお部屋のリストから、予約の部屋を除外する。

関連する問題