为什么Oracle通过rownum连接使行变得奇怪...?我不明白

问题描述 投票:0回答:1
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

oracle
1个回答
0
投票
您的层次结构查询根据条件rownum <= 3将层次结构中的一行连接到另一行。

您的起始行集是:

1. 'A' 2. 'B' 3. 'C'

查询生成的第一行是:

1. 'A' rownum=1 level=1

现在查询查询该行集的该行的任何直接“子级”。它找到第一个记录'A'。确定此行是否是我们第一行的子级的条件是rownum <= 3。由于要生成的行的rownum2,因此满足条件。因此发出此行:

2. 'A' -> 'A' rownum=2 level=2

现在查询查询行集

再次查找该行的任何直接“子级”。它找到第一个记录'A'。再次检查条件rownum <= 3;由于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

它也找不到该记录的任何子项,并且查询已完成。
© www.soinside.com 2019 - 2024. All rights reserved.