为什么我的 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>
干杯!!
我的 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>
干杯!!