|
Программирование >> Преобразование значений null
Как видно из приведенного выше результирующего множества, рефлексивное объединение упрощает задачу по выявлению перекрытия дат; теперь остается просто выбрать все строки, в которых B START выпадает между A START и A END. Предикат WHERE в строках 7 и8 решения: and b.proj start >= a.proj start and b.proj start <= a.proj end выполняет именно это. Когда получены необходимые строки, создание сообщений - это всего лишь дело конкатенации возвращенных значений. Пользователям Oracle доступна оконная функция LEAD OVER, которая позволяет избежать рефлексивного объединения, если один служащий ведет фиксированное число проектов. Использование этой функции может пригодиться, если рефлексивное объединение слишком дорого для конкретного рассматриваемого случая (если рефлексивное объединение требует больше ресурсов, чем сортировка, необходимая для LEAD OVER). Например, рассмотрим альтернативное решение для служащего KING с использованием функции LEAD OVER: select empno, ename, proj id, proj start, proj end, case when lead(proj start,1)over(order by proj start) between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,2)over(order by proj start) between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,3)over(order by proj start) between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,4)over(order by proj start) between proj start and proj end then lead(proj id)over(order by proj start) end is overlap from emp project where ename = KING EMPNO ENAME PROJ ID PROJ START PROJ END IS OVERLAP 7839 KING 2 17-JUN-2005 21-JUN-2005 5 7839 KING 5 20-JUN-2005 24-JUN-2005 8 7839 KING 8 23-JUN-2005 25-JUN-2005 7839 KING 11 26-JUN-2005 27-JUN-2005 7839 KING 14 29-JUN-2005 30-JUN-2005 Поскольку для служащего KING количество проектов фиксировано и равно пяти, для сравнения дат всех проектов без рефлексивного объединения можно использовать LEAD OVER. С этого момента формирование результирующего множества не составляет труда. Просто выбираем строки, в которых значение столбца IS OVERLAP (перекрывается) не NULL: select empno,ename, project is overlap overlaps project proj id msg from ( select empno, ename, proj id, proj start, proj end, case when lead(proj start,1)over(order by proj start) between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,2)over(order by proj start) between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,3)over(order by proj start) between proj start and proj end then lead(proj id)over(order by proj start) when lead(proj start,4)over(order by proj start) between proj start and proj end then lead(proj id)over(order by proj start) end is overlap from emp project where ename = KING ) where is overlap is not null EMPNO ENAME MSG 7839 KING project 5 overlaps project 2 7839 KING project 8 overlaps project 5 Чтобы в решении участвовали все служащие (не только KING), в функции LEAD OVER выполняем сегментирование по ENAME: select empno,ename, project is overlap overlaps project proj id msg from ( select empno, ename, proj id, proj start, proj end, case when lead(proj start,1)over(partition by ename order by proj start) between proj start and proj end then lead(proj id)over(partition by ename order by proj start) when lead(proj start,2)over(partition by ename order by proj start) between proj start and proj end then lead(proj id)over(partition by ename order by proj start) when lead(proj start,3)over(partition by ename order by proj start) between proj start and proj end then lead(proj id)over(partition by ename order by proj start) when lead(proj start,4)over(partition by ename order by proj start) between proj start and proj end then lead(proj id)over(partition by ename order by proj start) end is overlap from emp project ) where is overlap is not null EMPNO ENAME MSG 7782 CLARK project 7 overlaps project 4 7782 CLARK project 10 overlaps project 7 7782 CLARK project 13 overlaps project 10 7839 KING project 5 overlaps project 2 7839 KING project 8 overlaps project 5 7934 MILLER project 6 overlaps project 3 7934 MILLER project 12 overlaps project 9
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |