Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oracle分层查询按根循环和连接_Oracle_Hierarchical - Fatal编程技术网

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

有人能解释一下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 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 现在我们知道abba。 因此存在一个循环,如果我们将分层查询编写为

从表\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可用于输出属于起始节点的列。