Sql вопрос, как выбрать клиентов, которые никогда не останавливались в комнате стоимостью 5000? - PullRequest
0 голосов
/ 07 октября 2019

Это база данных

комната ( room_id , цена)

клиент ( client_id , имя)

остался( StartDate , EndDate, room_id , client_id)

Я хочу выбрать имена всех клиентов, которые никогда не находились в комнате, цена которой превышает 5000. Я попробовал этот код:

select client.name
from client
inner join stayed on client.client_id = stayed.client_id
inner join room on stayed.room_id = room.room_id
Group by name
having room.price < 5000

Он печатает мне значения клиентов, которые остались в комнате <5000, но некоторые из них, возможно, остались в комнате> 5000 в другое время.

Ответы [ 3 ]

3 голосов
/ 07 октября 2019

Вы можете использовать агрегатную функцию MAX, указав:

select client.name from client inner join stayed
on client.client_id = stayed.client_id inner join
room on stayed.room_id= room.room_id
Group by name
having MAX(room.price) < 5000
2 голосов
/ 07 октября 2019

Я рекомендую not exists для этого:

select c.name
from client c
where not exists (select 1
                  from stayed s join
                       room r
                       on s.room_id = r.room_id
                  where c.client_id = s.client_id and
                        r.price >= 500
                 );

Это почти прямой перевод вашего вопроса. Примечание. Если вы попытаетесь выполнить внутреннее объединение для этого, вы будете скучать по клиентам, которые вообще не оставались ни в каких комнатах. В соответствии с вашим вопросом, вы бы пропустили этих клиентов в наборе результатов.

0 голосов
/ 07 октября 2019

Это другой подход

SELECT c.Name
FROM client 
WHERE c.client_id NOT IN (
                          SELECT s.client_id 
                          FROM stayed s INNER JOIN room r 
                          ON s.room_id = r.room_id 
                          WHERE r.price > 5000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...