Reputation: 135
Hotel( hotelNo, hotelName, hotelAddress, country)
Room (roomNo, hotelNo, type, price)
Guest( guestNo, guestName, guestAddress, country)
Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo)
The question I'm trying to solve is,
--Use 2019-02-05 as today's date. List the details of all rooms at the hotels with 'Grosvener' in name, including the name of the guest staying in the room, if the room is occupied.List in hotelNo, roomNo order.
It runs, but it says 'no rows selected.' what am I possibly missing?
SELECT r.roomNo, r.hotelNo, r.type, r.price, guestName
FROM Room r
LEFT OUTER JOIN Booking b
ON r.hotelNo = b.hotelNo
NATURAL JOIN Guest
WHERE r.hotelNo IN
(SELECT hotelNo FROM Hotel
WHERE hotelName LIKE 'Grosvener%')
AND ((b.dateFrom <= DATE'2019-02-05') AND
(dateTo IS NULL OR dateTo >= DATE'2019-02-05'))
ORDER BY hotelNo, roomNo;
Upvotes: 0
Views: 90
Reputation: 135
Thank you all for answer my question.
SELECT r.roomNo, r.hotelNo, r.type, r.price, guestName
FROM Hotel h
JOIN Room r
ON r.hotelNo = h.hotelNo
LEFT JOIN
(
SELECT b.hotelNo, b.roomNo, g.guestName, b.dateTo, b.dateFrom
FROM Guest g
JOIN Booking b
ON g.guestNo = b.guestNo
WHERE b.dateFrom <= DATE'2019-02-05'
AND (dateTo IS NULL OR dateTo >= DATE'2019-02-05')
) bo
ON r.hotelNo = bo.hotelNo
AND r.roomNo = bo.roomNo
WHERE h.hotelName LIKE '%Grosvenor%'
ORDER BY h.hotelNo, r.roomNo
;
how do you think about this code tho? This seems like the only code that gives me right answer but It's way too long.
Upvotes: 0
Reputation: 65228
I suppose there is problem related to the parantheses usage for the subquery which starts with SELECT hotelNo ...
, the following usage might help :
SELECT r.roomNo, r.hotelNo, r.type, r.price, guestName
FROM Room r
LEFT OUTER JOIN Booking b
ON r.hotelNo = b.hotelNo NATURAL
JOIN Guest
WHERE r.hotelNo IN
(SELECT hotelNo
FROM Hotel
WHERE hotelName LIKE 'Grosvener%'
AND ( ( b.dateFrom <= date'2019-02-05' AND dateTo >= date'2019-02-05' )
OR ( dateTo IS NULL )))
ORDER BY hotelNo, roomNo;
Upvotes: 1
Reputation: 337
Why do you use natural join? Use left outer join (in case there are no guests for a specified booking) .
SELECT r.roomNo, r.hotelNo, r.type, r.price, guestName
FROM Room r
LEFT OUTER JOIN Booking b
ON r.hotelNo = b.hotelNo
LEFT OUTER JOIN Guest g
ON b.guestNo=g.guestNo
WHERE r.hotelNo IN
(SELECT hotelNo FROM Hotel
WHERE hotelName LIKE 'Grosvener%')
AND ((b.dateFrom <= DATE'2019-02-05') AND
(dateTo IS NULL OR dateTo >= DATE'2019-02-05'))
ORDER BY hotelNo, roomNo;
Upvotes: 1
Reputation: 212
I think you have to use an identifier to the Guest table as well. Please try following query.
SELECT r.roomNo, r.hotelNo, r.type, r.price, g.guestName
FROM Room r
LEFT OUTER JOIN Booking b
ON r.hotelNo = b.hotelNo
NATURAL JOIN Guest g
WHERE r.hotelNo IN
(SELECT hotelNo FROM Hotel
WHERE hotelName LIKE 'Grosvener%')
AND ((b.dateFrom <= DATE'2019-02-05') AND
(dateTo IS NULL OR dateTo >= DATE'2019-02-05'))
ORDER BY r.hotelNo, r.roomNo;
Upvotes: 1