Диапазон Oracle и подзапрос - PullRequest
3 голосов
/ 11 мая 2011

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

Название таблицы: расписание

  • user_id
  • StartDate
  • EndDate
  • sequencyID

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

Вот что у меня есть

SELECT * 
  FROM schedule 
 WHERE user_id = 123456;

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

SELECT * 
  FROM schedule 
 WHERE user_id = 0;

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 11 мая 2011
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
  )
0 голосов
/ 11 мая 2011

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...