
- •Урок 12. РекурсивныйSql
- •Древовидные структуры
- •Стандартное представление и манипулирование деревьями в sql
- •Рекурсивные запросы в Oracle
- •Фраза startwith
- •Фраза connectby
- •Использование псевдостолбца level
- •Задание условия
- •Условие на глубину иерархической структуры
- •Упорядочение строк с помощью фразы order by
- •Подзапрос в startwith
- •Рекурсивные запросы в стандарте sql
- •Определение повторяющихся подзапросов
- •Рекурсивное выполнение запросов
- •Примеры рекурсивных запросов: рейсовые полеты
- •Рекурсия с накоплением
- •Рекурсия и соединение таблиц
- •Отрицание и группирование в рекурсии
- •Примеры рекурсивных запросов: комплектация изделий
- •Вычисление промежуточных количественных характеристик
- •Итоговые количественные вычисления
- •Игнорирование фиктивных изделий
- •В каких агрегатах используется деталь?
- •Parts explosion excluding base parts (Testing For Leaf Nodes In a Parts Explosion)
- •Характеристики поиска
- •Фиксация наличия циклов
- •Направление поиска
- •Более сложная структура рекурсивного запроса
- •Рекурсивные представления
- •Различные виды рекурсии
- •Прямая и взаимная рекурсия
- •Линейная и нелинейная рекурсия
- •Подведение итогов
- •Самостоятельная работа
Задание условия
Следующий запрос подобен предыдущему за исключением того, что в нем не выбираются преподаватели–доценты.
SELECTLPAD(' ',2*(LEVEL-1)) ||NameAS"Фамилия",TchPKAS"Номер преп.",ChiefAS"Номер руков.",PostAS"Должность преп."FROM TEACHER
WHERE LOWER(Post) <> 'доцент' START WITH Chief IS NULL CONNECT BY PRIOR TchPK = Chief;
Фамилия Номер преп. Номер руков. Должность преп. ----------------- ----------- ------------ --------------- Сидоров 16 профессор Хоменко 2 4 преподаватель Витковский 1 2 ассистент Воробьев 3 4 ассистент Кузнецов 5 4 преподаватель Марченко 9 5 ассистент Козлитин 8 6 ассистент Недоводеев 11 7 преподаватель Резник 10 16 профессор Ахромеев 13 профессор Дараганов 15 преподаватель
11 строк выбрано.
Обратите внимание, что преподаватели–доценты не попали в результат, но их подчиненные в списке присутствуют, причем с сохранением третьего уровня вложенности (это видно по отступу расположения их фамилий, не смотря на то, что согласно полученному результату они вроде бы непосредственно подчинены Сидорову, который находится на первом уровне).
Условие на глубину иерархической структуры
Следующее предложение подобно первому за исключением того, что в нем используется псевдостолбец LEVELдля вывода сведений о служащих первых двух уровней иерархической структуры.
SELECTLPAD(' ',2*(LEVEL-1)) ||NameAS"Фамилия",TchPKAS"Номер преп.",ChiefAS"Номер руков.",PostAS"Должность преп."FROM TEACHER START WITH Chief IS NULL CONNECT BY PRIOR TchPK = Chief AND LEVEL <=2;
Фамилия Номер преп. Номер руков. Должность преп. ----------------- ----------- ------------ --------------- Сидоров 16 профессор Радишевский 4 16 доцент Заплатинский 6 16 доцент Лебедь 7 16 доцент Резник 10 16 профессор Ахромеев 13 профессор Наумов 14 доцент Дараганов 15 преподаватель
8 строк выбрано.
Наконец, если нужно выбрать иерархическое поддерево, начиная с преподавателя Радишевского, то соответствующее условие следует ввести во фразу START WITH, как это показано в следующем примере.
SELECTLPAD(' ',2*(LEVEL-1)) ||NameAS"Фамилия",TchPKAS"Номер преп.",ChiefAS"Номер руков.",PostAS"Должность преп."FROM TEACHER START WITH UPPER(Name) = 'РАДИШЕВСКИЙ' CONNECT BY PRIOR TchPK = Chief;
Фамилия Номер преп. Номер руков. Должность преп. ----------------- ----------- ------------ --------------- Радишевский 4 16 доцент Хоменко 2 4 преподаватель Витковский 1 2 ассистент Воробьев 3 4 ассистент Кузнецов 5 4 преподаватель Марченко 9 5 ассистент
6 строк выбрано.