2016-04-16 3 views
0

Как вы все знаете scott.emp Таблица Oracle не имеет никакого цикла в иерархии. Но я изменил emp таблицу немного (UPDATE emp SET mgr=7654 WHERE empno=7698), где я изменил менеджера Мартина как менеджера Блейка и Блейка в роли Мартина и произнес следующий запрос.Почему CONNECT_BY_ISCYCLE не дает 1, если таблица имеет цикл?

SELECT 
    empno, 
    ename, 
    mgr, 
    level, 
    connect_by_iscycle 
FROM emp 
START WITH mgr IS NULL 
CONNECT BY NOCYCLE prior empno=mgr 
ORDER SIBLINGS BY mgr 

Но это не дает ссылки на Мартин и Блейк и не отображает 1 в ожидаемом поле. Пожалуйста, ответьте на причину, если вы можете понять.

ответ

0

Ни Мартин, ни Блейк никогда не достигаются в иерархии. Вы сделали их взаимозависимыми, но уже не в какой-либо цепочке, которую вы выбираете, из-за условия начала.

Критерии подключения: prior emp = mgr, поэтому они основаны на том, что они связаны, но ни одна из них не связана с кем-либо еще над ними. Они образуют свой собственный маленький остров, и этот остров не соответствует состоянию старта mgr IS NULL. Или если вы предпочитаете, если вы начинаете с любой записи, где mgris null нет ни одного пути до любой из этих записей.

Если вы удалили условие начала, вы увидите гораздо больше данных, которые не хотите, но это будет включать Мартина и Блейка и покажет флаг цикла для них.

+0

Большое спасибо ... Мартин и Блейк совсем не в Дереве ... правильно? –

+0

Правильно, из-за корня, который вы определили 'mgr is null. –