Моя схема:
Hotel (hotelNo, hotelName, city)
Room (roomNo, hotelNo, type, price)
Booking (hotelNo, guestNo, dateFr, dateTo, roomNo)
Guest (guestNo, guestName, guestAddress)
Я хочу отобразить все детали номера и guestName, если номер был занят на дату, которую я поставил в состоянии для конкретного отеля.
I может выполнить запрос, чтобы отобразить hotelNo, hotelName, city и guestName, который удовлетворяет условию следующим образом:
select h.hotelNo, h.hotelName, h.city, g.guestName
from Hotel h
join Booking b on (h.hotelNo = b.hotelNo)
join Guest g on (b.guestNo = g.guestNo)
where h.hotelName = 'Grouse Hotel'
and TO_DATE('04-Jan-2020') between b.dateFrom and b.dateTo;
Приведенное выше возвращает единственную запись, которую я хочу.
1 Grouse Hotel London Marie King
но когда я пытаюсь теперь получить информацию о номере, а это то, что мне нужно, я получаю одного и того же отдельного гостя три раза в трех типах номеров, доступных в отеле Grouse.
select r.roomNo, r.hotelNo, r.room_type, r.price, g.guestName
from Room r
join Hotel h on (h.hotelNo = r.hotelNo)
join Booking b on (r.hotelNo = b.hotelNo)
join Guest g on (b.guestNo = g.guestNo)
where TO_DATE('04-Jan-2020') between b.dateFrom and b.dateTo
and h.hotelName = 'Grouse Hotel';
возвращает
1 1 single 120 Marie King
2 1 double 200 Marie King
3 1 suite 500 Marie King