Извините, если название немного сбивает с толку, это моя первая публикация.
По сути, у меня есть таблица под названием roombooking, где у комнаты есть номер комнаты (r_no), ссылка на бронирование (b_ref), а также дата заезда и выезда (checkin и checkout соответственно). Из-за нескольких различных b_refs, r_no появляется в таблице несколько раз с разными датами регистрации и оплаты.
Я хочу выбрать все r_nos, где checkin! = "DateX", и чтобы он отображал только те комнаты, где он и любые дубликаты не содержат "dateX" в столбце отметки.
Чтобы предоставить пример данных:
R_NO B_REF CHECKIN
101 999 2019-09
101 998 2019-08
102 997 2019-07
То, что я по сути хочу видеть, когда я запускаю свой оператор SQL (где dateX = 2019-09), - это выбрать только 102, поскольку, несмотря на то, что 101 (b_ref 998) имеет другую дату проверки, он дублирует 2019-09 в проверке столбец и поэтому ни один из них не появляется в результате.
Для тех, кому интересно, мой текущий SQL:
SELECT DISTINCT r_no
from roombooking
where checkin != '2019-09';
Однако (используя данные примера) в качестве результатов будут возвращены как 101, так и 102, чего я не хочу.
Надеюсь, это понятно, и снова прошу прощения, если нет, это мой первый пост.
2 ответа
Разбейте его на 2 условия, чтобы применить их в качестве фильтров:
checkin
не должно совпадать с указанной датойr_no
не должно совпадать сr_no
в строках, гдеcheckin
равно указанной дате
Например,
SELECT DISTINCT r_no FROM roombooking
WHERE
checkin != '2019-09' AND
r_no NOT IN (SELECT DISTINCT r_no FROM roombooking WHERE checkin = '2019-09')
Есть несколько способов добиться этого, в зависимости от вашего варианта использования и размера данных. Несколько вариантов
- Используйте подзапрос, чтобы выбрать повторяющиеся комнаты и удалить их из основного запроса, как показано выше.
- Используйте CTE, чтобы выбрать повторяющиеся комнаты и удалить их в основном запросе, присоединившись к CTE
- Самостоятельно присоединяйтесь к одному столу, чтобы исключить повторяющиеся комнаты
Насколько я понимаю ваши требования, простой способ сделать это
select distinct r_no from roombooking r1
where not exists (
select * from roombooking r2
where r1.r_no = r2.r_no
and r2.checkin = '2019-09'
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.