оракул иерархический запрос ноциклирование и подключение по корню - PullRequest
2 голосов
/ 26 февраля 2012

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

Ответы [ 2 ]

6 голосов
/ 26 февраля 2012

Если в ваших данных есть цикл (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 дает мне доступ к King employee_id даже на четыре уровня ниже. Сначала этот оператор меня очень смутил, подумав, что это означает «соединиться с помощью корневого элемента» или что-то в этом роде. Думайте об этом больше как о «корне предложения CONNECT BY».

0 голосов
/ 24 октября 2017

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

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

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

мыget connect by loop error

Следовательно, используйте nocycle to allow oracle для получения результатов, даже если петля существует.

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

...