Извините, если название немного сбивает с толку, это моя первая публикация.

По сути, у меня есть таблица под названием 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, чего я не хочу.

Надеюсь, это понятно, и снова прошу прощения, если нет, это мой первый пост.

0
Spectromon 5 Дек 2020 в 18:56

2 ответа

Лучший ответ

Разбейте его на 2 условия, чтобы применить их в качестве фильтров:

  1. checkin не должно совпадать с указанной датой
  2. 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')

Есть несколько способов добиться этого, в зависимости от вашего варианта использования и размера данных. Несколько вариантов

  1. Используйте подзапрос, чтобы выбрать повторяющиеся комнаты и удалить их из основного запроса, как показано выше.
  2. Используйте CTE, чтобы выбрать повторяющиеся комнаты и удалить их в основном запросе, присоединившись к CTE
  3. Самостоятельно присоединяйтесь к одному столу, чтобы исключить повторяющиеся комнаты
0
svetha.cvl 5 Дек 2020 в 16:16

Насколько я понимаю ваши требования, простой способ сделать это

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'
0
TAM 5 Дек 2020 в 16:20