私はホテル管理システムを構築しています。指定された日付に利用可能な部屋を見つけることに固執しています。私は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 = ?)