Oracle 如何使用"connect by rownum <= n"评估分层查询


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。由于要生成的行的rownum2,因此满足条件;所以这一行被发射:

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

它也找不到此记录的任何子项,查询已经完成。

最新更新