#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. Мне очень жаль. Это сработало идеально. Я неправильно написал статью. Большое вам спасибо.