Может ли кто-нибудь объяснить использование nocycle и подключение по корневым предложениям в иерархических запросах в оракуле, а также когда мы не используем «начать с», в каком порядке мы получаем строки, я имею в виду, когда мы не используем «начать с», мы получаем много много строк, может ли кто-нибудь объяснить nocycle и подключиться с помощью root (чем отличается от start with?), используя простую таблицу emp, спасибо за помощь
Иерархический запрос оракула без цикла и подключение с правами root
Ответы (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».
Вот об использовании 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;