oracle分层查询按根循环和连接
有人能解释一下nocycle和connect by root子句在oracle分层查询中的用法吗?还有,当我们不使用“start with”时,我们得到行的顺序是什么,我的意思是当我们不使用“start with”时,我们得到很多行,有人能用简单的emp表解释nocycle和connect by root(与start with有何不同?),感谢您的帮助如果您的数据中有一个循环(a->B->a->B…),如果您执行分层查询,Oracle将抛出一个异常,oracle分层查询按根循环和连接,oracle,hierarchical,Oracle,Hierarchical,有人能解释一下nocycle和connect by root子句在oracle分层查询中的用法吗?还有,当我们不使用“start with”时,我们得到行的顺序是什么,我的意思是当我们不使用“start with”时,我们得到很多行,有人能用简单的emp表解释nocycle和connect by root(与start with有何不同?),感谢您的帮助如果您的数据中有一个循环(a->B->a->B…),如果您执行分层查询,Oracle将抛出一个异常,ORA-01436:CONNECT BY l
ORA-01436:CONNECT BY loop in user data
NOCYCLE
指示Oracle返回行,即使存在这样的循环
CONNECT\u BY\u 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\u BY\u ROOT
操作符允许我访问King's employee\u id,甚至可以访问四层。一开始我被这个操作符弄糊涂了,以为它的意思是“通过根元素连接”之类的。把它想象成“CONNECTBY子句的根。”这里是关于查询中的nocycle用法
假设我们有一张简单的桌子
具有r1和r2列名以及
第一行r1=a,r2=b
第二行r1=b,r2=a
现在我们知道a指b,b指a。
因此存在一个循环,如果我们将分层查询编写为
从表\u名称中选择r1
从r1='a'开始
通过之前的r2=r1连接强>
我们通过循环获得连接错误
因此,使用nocycle来允许oracle给出结果,即使循环存在
因此产生了疑问
从表\u名称中选择r1
从r1='a'开始
在r2=r1之前,通过nocycle连接您好,非常感谢您的解释。是的,但我仍然感到困惑,因为我们也可以用'start with'子句获取根元素,不是吗?我使用“start with employee_id=102”进行了检查,并认为层次结构将以102开始,但connect by root将给出“100”作为该员工层次结构中的根。然而,root\u id列给出了102,所以如果我们可以使用'start with'子句获得根元素,为什么要使用connect\u by\u root。另外,请再次向我解释循环:(如果A是B的管理者,那么B又是A的管理者,我知道我不明白这一点,但请解释,非常感谢您的帮助!开始让您定义递归的开始条件(通过在用作递归起点的节点上定义过滤器).CONNECT_BY_ROOT可用于输出属于起始节点的列。