Oracle SQL объединение нескольких таблиц с возвратом дубликатов - PullRequest
0 голосов
/ 03 марта 2020

Моя схема:

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

1 Ответ

1 голос
/ 03 марта 2020

Во втором запросе пропущено условие соединения между бронированием и номером, поэтому он связывает каждое бронирование со всеми номерами в соответствующем отеле.

Обратите внимание:

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 and r.roomNo = b.roomNo
join Guest g   on b.guestNo = g.guestNo    --^-- here
where 
    b.dateFrom <= DATE'2020-01-04' and b.dateTo >= DATE'2020-01-04'
    and h.hotelName = 'Grouse Hotel';

Обратите внимание, что я переписали ваше предложение where, чтобы оно позволяло базе данных использовать индекс, включающий столбцы даты, если таковые имеются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...