SQL Находит конкретную дату, когда комнаты не заняты полностью

#java #sql #datetime #sum #subquery

#java #sql #дата и время #сумма #подзапрос

Вопрос:

У меня есть две таблицы:

Тот, у которого есть таблица, подобная этой: резервирование имени таблицы:

 Name Room Seats Date
John 101  20    11/22
  

Имя таблицы Номера:

 Name Seats
101  30
202  40

SELECT *
FROM Reservations
WHERE date = '2020-11-22' AND
SELECT Reservations.Room
FROM Reservations
WHERE Reservations.Room NOT IN(SELECT Room.Name FROM Room)
  

Я попробовал приведенное выше утверждение, но оно не работает. Я хочу, чтобы команда возвращала все комнаты в дате, которые не используются. Он должен вернуть номер 202. Вот и все.

Комментарии:

1. Пожалуйста, предоставьте примеры данных и четкое объяснение логики, которую вы хотите реализовать.

2. Я уже это сделал. Спасибо 🙂

Ответ №1:

Я понимаю, что вам нужны номера, в которых есть свободные места на указанную дату. Один из вариантов использует подзапрос для фильтрации:

 select ro.*
from rooms ro
where ro.seats > (
    select coalesce(sum(re.seats), 0)
    from reservations re
    where re.room = ro.name and re.date = '2020-11-12'
)
  

С другой стороны, если вам нужны номера, для которых на данную дату вообще не существует резервирования, используйте not exists :

 select ro.*
from rooms ro
where not exists (
    select 1
    from reservations re
    where re.room = ro.name and re.date = '2020-11-12'
)
  

Комментарии:

1. Я не уверен, почему также добавляется номер места. Это не требуется .: D

2. Ну, я предположил, что может быть несколько бронирований на одну и ту же комнату и дату. Но это не повредит, если это не так, запрос по-прежнему работает так, как указано.

3. Это утверждение не работает. Не могли бы вы изменить то, что мне нужно. Я попытался изменить его, и это не сработает.

4. @Jabbaa11: почему вы не хотите, чтобы в результате была комната 101? Она занята не полностью (есть 30 мест, и занято только 20).

5. Мне очень жаль. Это сработало идеально. Я неправильно написал статью. Большое вам спасибо.