Страницы

29 июня 2015 г.

Oracle. Иерархические (рекурсивные запросы)

hierarchical_query_clause::=

Синтаксис написания иерархических запросов отличается от синтаксиса через CTE, как например в SQL Server. Для меня это стало неожиданностью.
Документация на основе которой я пишу этот пост доступна по ссылке.

Здесь я составлю краткий конспект, для тех кто понимает принципы рекурсии или просто хочет вспомнить как это делается.
Вся синтаксическая цепочка иерархических запросов изображена на рисунке в начале статьи.
Итак, по порядку.

START WITH.
Задает условия определения корня дерева.

CONNECT BY.
Определяет условие связи родительских записей и дочерних.

NOCYCLE.
Задает режим при котором будут игнорироваться "петли" в дереве. Т.е. ситуации когда родительская запись ссылается на дочернюю, а дочерняя снова на родительскую. С этой опцией у вас не будет переполнения рекурсии. Отследить зацикленные узлы можно с помощью поля CONNECT_BY_IS_CYCLE. Это поле вернет 1 если узел зациклен.

PRIOR
В условии CONNECT BY должен быть определен оператор PRIOR. Этот оператор задает направление развертывания иерархии. PRIOR указывается со стороны поля которое должно быть дочерним при развертывании. Т.е. таким образом мы указываем уловие "родитель" = "предыдущему потомку". Другими словами рекурсия на каждом новом проходе ищет потомков предыдущей записи, собирая иерархию.

CONNECT_BY_ROOT.
Псевдополе которое выводит значение из корневой записи на протяжении всей выборки. 

CONNECT_IS_LEAF.
Псевдополе для индикации листов дерева. Т.е. если у узла в иерархии нет потомков, псевдополе выведет 1, иначе 0. 

Примеры можно увидеть здесь.
Более подробно о принципе работы на русском - здесь.

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

Отправить комментарий