有人可以在oracle中解释nocycle的使用并通过root子句连接,当我们不使用'start with'时我们得到行的顺序是什么,我的意思是当我们不使用'start with'时我们得到很多行,任何人都可以解释nocycle并通过root连接(与开始时有什么不同?)使用简单的emp表,谢谢你的帮助
答案 0 :(得分:6)
如果您的数据中有一个循环(A - > B - > A - > B ...),如果您执行分层查询,Oracle将抛出异常ORA-01436: CONNECT BY loop in user data
。 NOCYCLE
指示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;