Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD / Урок 12-Рекурсивный SQL.doc
Скачиваний:
56
Добавлен:
20.02.2016
Размер:
721.41 Кб
Скачать

Рекурсивные запросы в Oracle

В Oracleсуществует свой собственный механизм рекурсивного вычисления запросов, который мы опишем в этом разделе. В следующем разделе мы представим подход рекурсивного вычисления запросов, принятый в стандартеSQL.

Если таблица имеет древовидную структуру, то рекурсивное вычисление с произвольной глубиной вложенности поддерживается с помощью следующих трех фраз предложения SELECT:

START WITH— указывает ту вершину или вершины дерева, которые являются начальными для организации рекурсивного вычисления.

CONNECT BY— указывается, каким образом связаны между собой родительские и дочерние вершины (строки), В простейшем случае указывается, какие именно столбцы используются для установления этих связей.

WHERE— стандартная фраза предложенияSELECT, которая ограничивает выводимые строки таблицы без какого–либо воздействия на древовидную структуру строк в таблице.

Эта информация используется для организации следующей процедуры рекурсивного вычисления запроса:

1. Если во фразе WHEREприсутствует предикат соединения двух или нескольких таблиц, то такое соединение производится в первую очередь.

2. Производится отбор тех строк отношения, которые удовлетворяют условию фразы START WITH. Эти строки рассматриваются как корневые для последующего рекурсивного вычисления.

2. По каждой из таким образом определенной корневой строке производится поиск ее дочерних строк. Дочерние вершины определяются согласно условию, заданному во фразе CONNECT BY.

3. Затем производится поиск последующих поколений дочерних строк. Для этого выбираются дочерние строки тех строк, которые были найдены на шаге 2, затем дочерние строки этих дочерних строк и т.д. до трех пор, пока не будут достигнуты строки–листья. При этом на каждом шаге поиск следующих дочерних строк производится согласно условию фразы CONNECT BY, и при этом текущая строка рассматривается, как если бы она была корневая.

4. Если запрос содержит фразу WHERE, в которой имеются предикаты отбора строк, то устраняются строки, не удовлетворяющие условию этой фразы. При этом условие вычисляется для каждой строки индивидуально. Это означает, что не производится удаление дочерних строк той строки, которая не удовлетворяет условию этой фразы.

5. Полученные в результате рекурсивного вычисления строки выдаются в порядке, приведенном на рис. 10.3 ниже. На этой диаграмме дочерние вершины расположены под своими родительскими вершинами. Таким образом, упорядоченность определяется правилом обхода дерева сверху–вниз и слева–направо. Эта упорядоченность выдачи строк может меняться фразой ORDER BY.

Рис.10.3. Стандартный порядок выдачи строк таблицы при рекурсивном вычислении запроса

Обсудим вкратце фразы, которые используются в рекурсивных запросах.

Фраза startwith

Фраза START WITHпозволяет указать то поддерево всего иерархического дерева, которое будет участвовать в рекурсивном запросе. Это определяется заданием условия, которому должны удовлетворять строки таблицы, выступающие в качестве корня поддерева. Если эта фраза отсутствует, то все строки таблицы рассматриваются в качестве корневых. Условие фразыSTART WITHможет содержать подзапрос.