#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. Объединения могут привести к дублированию, если имеется более одной дочерней записи, связанной с родительской.