[英]Using JOIN with subquery
Hotel( hotelNo, hotelName, hotelAddress, country)
Room (roomNo, hotelNo, type, price)
Guest( guestNo, guestName, guestAddress, country)
Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo)
我要解决的问题是
-使用2019-02-05作为今天的日期。 列出酒店所有客房名称的详细信息,名称上带有``格罗夫纳''(Grosvener),包括入住客房的客人的姓名(如果房间已被占用)。
它会运行,但显示“未选择行”。 我可能会想念什么?
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;
我认为您也必须在Guest表中使用一个标识符。 请尝试以下查询。
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;
为什么使用自然联接? 使用左外部联接(如果指定预订没有客人)。
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;
我想存在与以SELECT hotelNo ...
开头的子查询的括号用法有关的问题,以下用法可能会有所帮助:
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;
谢谢大家回答我的问题。
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
;
您如何看待这段代码? 这似乎是唯一可以给我正确答案的代码,但是时间太长了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.