Иерархический запрос оракула без цикла и подключение с правами root

Может ли кто-нибудь объяснить использование nocycle и подключение по корневым предложениям в иерархических запросах в оракуле, а также когда мы не используем «начать с», в каком порядке мы получаем строки, я имею в виду, когда мы не используем «начать с», мы получаем много много строк, может ли кто-нибудь объяснить nocycle и подключиться с помощью root (чем отличается от start with?), используя простую таблицу emp, спасибо за помощь


person ratsy    schedule 25.02.2012    source источник


Ответы (2)


Если в ваших данных есть цикл (A -> B -> A -> B...), Oracle выдаст исключение ORA-01436: CONNECT BY loop in user data, если вы выполните иерархический запрос. NOCYCLE указывает Oracle возвращать строки, даже если такой цикл существует.

CONNECT_BY_ROOT дает вам доступ к корневому элементу даже на несколько уровней ниже в запросе. Используя схему HR:

select level, employee_id, last_name, manager_id ,
connect_by_root employee_id as root_id
from employees
connect by prior employee_id = manager_id
start with employee_id = 100

     LEVEL EMPLOYEE_ID LAST_NAME                 MANAGER_ID    ROOT_ID
---------- ----------- ------------------------- ---------- ----------
         1         100 King                                        100
         2         101 Kochhar                          100        100
         3         108 Greenberg                        101        100
         4         109 Faviet                           108        100
...

Здесь вы видите, что я начал с сотрудника 100 и начал искать его сотрудников. Оператор CONNECT_BY_ROOT дает мне доступ к employee_id Кинга даже на четыре уровня ниже. Сначала я был очень смущен этим оператором, думая, что он означает «подключиться к корневому элементу» или что-то в этом роде. Думайте об этом больше как о «корне предложения CONNECT BY».

person eaolson    schedule 25.02.2012
comment
Привет, большое спасибо за объяснение ... да, но я все еще в замешательстве, так как мы можем получить корневой элемент с предложением «начать с», не так ли? Я проверил это, используя «начать с employee_id = 102», и подумал, что иерархия начнется со 102, но при подключении с помощью root будет 100 в качестве корня в этой иерархии сотрудников. Однако столбец root_id дает 102, поэтому, если мы можем получить корневой элемент, используя предложение «начать с», зачем использовать connect_by_root. Также, пожалуйста, объясните мне цикл еще раз :( если A является менеджером B, то снова B является менеджером A? Я знаю, что это глупо, но я не понимаю, но, пожалуйста, объясните, большое спасибо за помощь! - person ratsy; 27.02.2012
comment
Начать с позволяет определить начальные условия для рекурсии (определив фильтр для узлов, которые используются в качестве начальных точек для рекурсии). CONNECT_BY_ROOT позволяет выводить столбцы, принадлежащие начальным узлам. - person Danny Varod; 26.11.2012

Вот об использовании nocycle в запросе.

Предположим, у нас есть простая таблица с именами столбцов r1 и r2 и значениями для первой строки r1=a,r2=b и второй строки r1=b,r2=a Теперь мы знаем, что a относится к >b и b ссылаются на a . Следовательно, существует цикл, и если мы напишем иерархический запрос как

выберите r1 из table_name, начните с r1='a', подключитесь к предыдущему r2=r1;

мы получаем подключение по циклу ошибка

Следовательно, используйте nocycle, чтобы разрешить оракулу выдавать результаты, даже если существует цикл.

Следовательно, запрос выбрать r1 из table_name начинается с r1='a', соединяется с помощью nocycle до r2=r1;

person Sushmita Mitkar    schedule 24.10.2017