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列
但我不知道为什么connectbyrownum只显示这些值。。。
请帮我电汇
您的层次结构查询根据标准rownum <= 3
将层次结构中的一行连接到另一行。
首先,重要的是要理解rownum
是一个伪列,它在时生成,并且只有当查询决定将生成一行时才生成<em];对于发出的第一个记录,它总是从1
开始,并且只随着每个后续记录的发出而递增(这就是为什么在执行类似where rownum > 1
的程序时永远不会得到结果(。>
其次,重要的是要理解,在Oracle中,分层查询是使用深度优先搜索构建的。
您的起始行集是:
1. 'A'
2. 'B'
3. 'C'
查询生成的第一行是:
1. 'A' rownum=1 level=1
现在,查询返回并探测原始行集,以查找此行的任何直接"子项"。它找到第一个记录CCD_ 5。确定此行是否是我们第一行的子行的条件是rownum <= 3
。由于要生成的行的rownum
是2
,因此满足条件;所以这一行被发射:
2. 'A' -> 'A' rownum=2 level=2
查询现在再次探测行集,查找此行的任何直接"子级"。它找到第一个记录CCD_ 9。再次检查条件CCD_ 10;由于rownum
现在将是3
,因此满足该条件;所以这一行被发射:
3. 'A' -> 'A' -> 'A' rownum=3 level=3
查询现在再次探测行集,查找此行的任何直接"子级"。但是,对于新行,rownum
将是4
,因此它找不到任何"子级"。
因此,它返回到先前生成的行2,并继续在行集中搜索任何其他子项;同样,rownum
将是4
,因此它仍然无法找到更多的子代。它对第1行执行相同操作,但找不到任何其他子级。
最后,它回到了树的根,并向前移动到行集中的下一条记录:
4. 'B' rownum=4 level=1
它在那里做同样的事情,在行集中搜索该记录的任何子项,但由于该条件而失败。
它最终到达行集中的最后一条记录:
5. 'C' rownum=5 level=1
它也找不到此记录的任何子项,查询已经完成。