With A as (
SELECT 'A' ID FROM DUAL
UNION ALL
SELECT 'B' FROM DUAL
UNION ALL
SELECT 'C' FROM DUAL
)
SELECT ID
, LEVEL AS LVL
, ROWNUM
, SYS_CONNECT_BY_PATH(LEVEL,'->') AS LV_PATH
, SYS_CONNECT_BY_PATH(ID,'->') AS ID_PATH
FROM A
CONNECT BY ROWNUM <= 3
Result
ID LVL ROWNUM LV_PATH ID_PATH
A 1 1 ->1 ->A
A 2 2 ->1->2 ->A->A
A 3 3 ->1->2->3 ->A->A->A
B 1 4 ->1 ->B
C 1 5 ->1 ->B
[why B and C has 1 level !?]
在此查询的结果中,B和C仅具有1个值(级别?)但A具有3个值和级别(并且ID_PATH结果仅包含A)
我知道按级别使用连接是使层次结构化,所以我知道它将使n + n ^ n列
但是我不知道为什么通过rownum连接仅显示这些值...
请帮助我TT
rownum <= 3
将层次结构中的一行连接到另一行。您的起始行集是:
1. 'A'
2. 'B'
3. 'C'
查询生成的第一行是:
1. 'A' rownum=1 level=1
现在查询查询该行集的该行的任何直接“子级”。它找到第一个记录'A'
。确定此行是否是我们第一行的子级的条件是rownum <= 3
。由于要生成的行的rownum
为2
,因此满足条件。因此发出此行:
2. 'A' -> 'A' rownum=2 level=2
现在查询查询行集再次查找该行的任何直接“子级”。它找到第一个记录
'A'
。再次检查条件rownum <= 3
;由于rownum
现在将是3
,因此满足条件;因此发出此行:3. 'A' -> 'A' -> 'A' rownum=3 level=3
查询现在将在行集再次中查找此新行的任何直接“子级”。但是,新行的
因此,它返回到先前生成的第2行,并继续在行集中搜索任何其他子级;同样,rownum
将是4
,因此它找不到任何“子级”。rownum
将是4
,因此仍然找不到更多的子代。它对第1行的操作相同,但是找不到其他子级。最后,它回到了树的根,并向前移动到行集中的下一条记录:
4. 'B' rownum=4 level=1
在此执行相同的操作,在行集中搜索该记录的任何子项,但由于条件而失败。它最终到达行集中的最后一条记录:
5. 'C' rownum=5 level=1
它也找不到该记录的任何子项,并且查询已完成。