基于 CONNECT BY 层次结构派生大纲编号
Deriving Outline Numbering based on CONNECT BY hierarchy
我希望根据 CONNECT BY 查询结果创建一个自动编号的大纲。
如果我的查询结果如下:
level col1
----- --------
1 text1
1 text2
2 text3
3 text4
3 text5
1 text6
我有兴趣像这样推导数字层次结构值:
level outline col1
----- ------- --------
1 1 text1
1 2 text2
2 2.1 text3
3 2.1.1 text4
3 2.1.2 text5
1 3 text6
感觉像是 sys_connect_by_path
或窗口 lag
- 但我没看到它...
您没有提供测试数据,所以我将在scott.emp
table上进行说明。
select level,
substr(sys_connect_by_path(rn, '.'), 2) as outline,
empno
from (
select empno, mgr,
row_number() over (partition by mgr order by empno) as rn
from scott.emp
)
start with mgr is null
connect by mgr = prior empno
order siblings by empno
;
LEVEL OUTLINE EMPNO
----- -------------- -----
1 1 7839
2 1.1 7566
3 1.1.1 7788
4 1.1.1.1 7876
3 1.1.2 7902
4 1.1.2.1 7369
2 1.2 7698
3 1.2.1 7499
3 1.2.2 7521
3 1.2.3 7654
3 1.2.4 7844
3 1.2.5 7900
2 1.3 7782
3 1.3.1 7934
在子查询中,我们为“兄弟姐妹”(rows/employees 具有相同的直接父代)提供一个序列号,并在 sys_connect_by_path
中使用它。要从分层查询中获得“正确”的排序,您需要按照在子查询中对它们进行排序的方式对兄弟姐妹进行排序(在我的例子中,按 empno
,这是主键;在你的例子中,如果 col1
可能有重复,在两个地方按 col1, rowid
排序以打破平局)。
我希望根据 CONNECT BY 查询结果创建一个自动编号的大纲。
如果我的查询结果如下:
level col1
----- --------
1 text1
1 text2
2 text3
3 text4
3 text5
1 text6
我有兴趣像这样推导数字层次结构值:
level outline col1
----- ------- --------
1 1 text1
1 2 text2
2 2.1 text3
3 2.1.1 text4
3 2.1.2 text5
1 3 text6
感觉像是 sys_connect_by_path
或窗口 lag
- 但我没看到它...
您没有提供测试数据,所以我将在scott.emp
table上进行说明。
select level,
substr(sys_connect_by_path(rn, '.'), 2) as outline,
empno
from (
select empno, mgr,
row_number() over (partition by mgr order by empno) as rn
from scott.emp
)
start with mgr is null
connect by mgr = prior empno
order siblings by empno
;
LEVEL OUTLINE EMPNO
----- -------------- -----
1 1 7839
2 1.1 7566
3 1.1.1 7788
4 1.1.1.1 7876
3 1.1.2 7902
4 1.1.2.1 7369
2 1.2 7698
3 1.2.1 7499
3 1.2.2 7521
3 1.2.3 7654
3 1.2.4 7844
3 1.2.5 7900
2 1.3 7782
3 1.3.1 7934
在子查询中,我们为“兄弟姐妹”(rows/employees 具有相同的直接父代)提供一个序列号,并在 sys_connect_by_path
中使用它。要从分层查询中获得“正确”的排序,您需要按照在子查询中对它们进行排序的方式对兄弟姐妹进行排序(在我的例子中,按 empno
,这是主键;在你的例子中,如果 col1
可能有重复,在两个地方按 col1, rowid
排序以打破平局)。