Oracle:在用户数据中按循环连接

Man*_*ish 5 oracle hierarchy hierarchical-data

我理解Oracle中何时可能发生循环.理论上它说如果一条记录既是另一个节点的父节点又同时是它的子节点,那么它就可以进入一个循环.

但是我无法理解为什么我的这个特定查询会进入循环.

SELECT Empno, Ename, Job
FROM Emp
START WITH Empno = 7839
CONNECT BY PRIOR
Job='PRESIDENT'
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这个数据如何导致循环.我做了一个CONNECT_BY_ISCYCLE检查,发现记录循环是KING(总统).但我仍然不明白怎么可能,因为KING是总统,而且我认为它没有任何方式成为表中任何记录的子女和父母.

请解释一下,为什么这是一个错误,循环在哪里?

提前致谢.

仅供参考,该表是Oracle中SCOTT用户的默认EMP表.

cha*_*ves 8

添加表达式 nocycle connect by nocycle


Mul*_*ync 5

为了查找父行的子节点,Oracle计算父行的CONNECT BY条件的PRIOR表达式以及表中每行的另一个表达式.条件为真的行是父项的子项.CONNECT BY条件可以包含其他条件以进一步过滤查询选择的行.

如果CONNECT BY条件导致层次结构中出现循环,则Oracle将返回错误.如果一行既是父行(或祖父母或直接祖先)又是另一行的子(或孙子或直接后代),则会发生循环.

如果没有满足START WITH且具有Job ='PRESIDENT'的行,则循环将永远不会发生(Oracle仅检索START WITH行)

如果表中有一行满足START WITH并且具有Job ='PRESIDENT',则在任何情况下都会发生循环,因为:
1.Oracle找到满足START WITH(根行)的所有行.
2.对于p.1中的每一行,Oracle会扫描整个表以查找后代.所有行(包括p.1中的行)都满足CONNECT BY中的条件(因为之前的Job ='PRESIDENT'总是为真)
3.明显......


小智 5

SELECT Empno, Ename, Job
FROM Emp
START WITH Empno = 7839
CONNECT BY nocycle PRIOR
Job='PRESIDENT'
Run Code Online (Sandbox Code Playgroud)