为什么我的 Oracle 分层查询仅在一级后停止

Why does my Oracle hierarchical query stop after one level only

我的 table 有一个类似于文件系统的面包屑来显示页面导航。例如 <level1> / <level2> / <level3>。我想从任何 <level1> 级别开始并导航到子 <level1> / <level2> 面包屑。我不关心它是广度优先还是深度优先,我只需要遵循层次结构,这样我就可以记录父子项以供其他用途。

我的尝试只给了我第一级并停止。

create table sc_hub_hierarchy_test (breadcrumb varchar2(1000),child_breadcrumb varchar2(1000),crumb_depth);

insert into sc_hub_hierarchy_test (breadcrumb,child_breadcrumb) values('Level1A','Level1A/Level2A',0);
insert into sc_hub_hierarchy_test (breadcrumb,child_breadcrumb) values('Level1B','Level1B/Level2A',0);
insert into sc_hub_hierarchy_test (breadcrumb,child_breadcrumb) values('Level1B','Level1B/Level2B',0);
insert into sc_hub_hierarchy_test (breadcrumb,child_breadcrumb) values('Level1A/Level2A','Level1A/Level2A/Level3A',2);

select breadcrumb
from sc_hub_hierarchy_test
start with crumb_depth=0
connect by breadcrumb=child_breadcrumb;

也尝试过:

select breadcrumb
from sc_hub_hierarchy_test
start with crumb_depth=0
connect by prior breadcrumb=child_breadcrumb;

我的结果如下:

Level1A
Level1B
Level1B
Level1A

** 注意,为简化问题,实际使用的数据有所不同。

在我的数据中,有多个根,因此如果将 "start with" 子句更改为 "where" 子句,将返回多行。不止一层。

我也尝试删除 "start with" 子句,并得到了更多结果。该行为就像是将 "start with" 子句上的条件应用于每个级别。

为什么拉里·埃里森在第一步之后决定停下来?

您缺少 PRIOR 关键字。

您的查询应该如下所示:

SQL> SELECT BREADCRUMB, LEVEL
  2    FROM SC_HUB_HIERARCHY_TEST
  3  START WITH CRUMB_DEPTH = 0
  4  CONNECT BY BREADCRUMB = PRIOR CHILD_BREADCRUMB;

BREADCRUMB           LEVEL
--------------- ----------
Level1A                  1
Level1A/Level2A          2
Level1B                  1
Level1B                  1

SQL>

干杯!!