oracle层次查询nocycle并通过root连接

时间:2012-02-25 22:31:39

标签: oracle hierarchical

有人可以在oracle中解释nocycle的使用并通过root子句连接,当我们不使用'start with'时我们得到行的顺序是什么,我的意思是当我们不使用'start with'时我们得到很多行,任何人都可以解释nocycle并通过root连接(与开始时有什么不同?)使用简单的emp表,谢谢你的帮助

2 个答案:

答案 0 :(得分:6)

如果您的数据中有一个循环(A - > B - > A - > B ...),如果您执行分层查询,Oracle将抛出异常ORA-01436: CONNECT BY loop in user dataNOCYCLE指示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运算符使我可以访问King的employee_id甚至四级。起初我被这个操作员弄得很困惑,认为它意味着“通过根元素连接”或其他东西。可以把它想象成“CONNECT BY子句的根源。”

答案 1 :(得分:0)

这是关于查询中的nocycle使用。

假设我们有一个简单的表格 使用r1和r2列名称和值 第一行r1 = a,r2 = b 第二行r1 = b,r2 = a 现在我们知道 a 是指 b b 是指 a 。 因此,如果我们将分层查询编写为

,则存在循环

从table_name中选择r1 以r1 =' a'开头 先前连接r2 = r1;

我们通过循环错误

进行连接

因此即使循环存在,也可以使用 nocycle 允许 oracle提供结果。

因此查询 从table_name中选择r1 以r1 =' a'开头 通过nocycle先连接r2 = r1;