繁体   English   中英

在子查询中使用JOIN

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM