Использование JOIN с подзапросом - PullRequest
0 голосов
/ 30 января 2019
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», включая имя гостя, который находится в номере, если номер занят. Список в hotelNo, номерNo order.он говорит: «не выбранные строки».что мне, возможно, не хватает?

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; 

Ответы [ 4 ]

0 голосов
/ 31 января 2019

Спасибо всем за ответ на мой вопрос.

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
;

как вы относитесь к этому коду?Это похоже на единственный код, который дает мне правильный ответ, но он слишком длинный.

0 голосов
/ 30 января 2019

Почему вы используете естественное соединение?Используйте левое внешнее объединение (в случае отсутствия гостей для указанного бронирования).

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; 
0 голосов
/ 30 января 2019

Я полагаю, что есть проблема, связанная с использованием паратезов для подзапроса, который начинается с 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;
0 голосов
/ 30 января 2019

Я думаю, что вы также должны использовать идентификатор для таблицы 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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...