Диапазон Oracle и подзапрос

#sql #oracle

#sql #Oracle

Вопрос:

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

Имя таблицы: расписание

  • идентификатор пользователя
  • дата начала
  • дата окончания
  • sequencyID

Ситуация такова, что у меня есть несколько строк, где user_id = 0. Это представляет собой открытое расписание, на которое кто-то может претендовать. Если расписание утверждается, ему присваивается определенный идентификатор пользователя. Здесь начинается сложная часть. Я пытаюсь выбрать пользователя и отобразить время расписания, которое не совпадает с тем, которое они уже приняли или запланировали.

Вот что у меня есть на данный момент

 SELECT * 
  FROM schedule 
 WHERE user_id = 123456;
  

Это дает мне все диапазоны времени, которые человек уже принял

 SELECT * 
  FROM schedule 
 WHERE user_id = 0;
  

Это дает мне все доступные строки расписания. Я не совсем уверен, как их объединить таким образом, чтобы конечным результатом был список элементов расписания, у которых user_id =0 и начальная / конечная дата не существуют между начальной датой и конечной из тех, которые уже назначены пользователю.

Я бы подумал, что это будет что-то вроде

 SELECT * 
  FROM schedule 
 WHERE user_id = 0 
   AND (loop through schedule rows testing for 
           (startdate < loopstartdate and enddate < loopstartdate) || 
           (startdate > loopenddate)
  

Where — это то, с чем я борюсь. Есть идеи? Если бы кто-нибудь мог хотя бы указать мне в правильном направлении, какой механизм я бы использовал, чтобы начать решать проблемы такого типа, это было бы потрясающе.

Ответ №1:

 SELECT a.*
FROM schedule a
WHERE user_id = 0
  AND NOT EXISTS (
    SELECT NULL
      FROM schedule b
      WHERE b.user_id = 123456
        AND b.start_date <= a.end_date
        AND b.end_date >= a.start_date
  )
  

Ответ №2:

Я думаю, что что-то вроде этого сработает. На самом деле я не могу протестировать это там, где я нахожусь, но попробую.

 SELECT a.* 
FROM SCHEDULE a,
(SELECT start_date, end_date FROM SCHEDULE WHERE user_id = 123456) b
WHERE a.user_id = 0
AND a.start_date BETWEEN b.start_date AND b.end_date
  

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

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