我尝试在Oracle PL SQL中编写一个返回特定结果的查询。 我的表中有一个分层组织单元。例如:
x ( is parent)
y (parent : x )-w ( parent : x )-z (parent : y )-u ( parent : y )-o ( parent : w )
我必须为以下组织生成系统代码:
x ( system code = 001 )- y ( system code = 001001)-w ( system code = 001002 )-z ( system code = 001001001) -u ( system code = 001001002 )-o ( system code =001002001 )
有什么想法吗? 此链接显示图形: https://www.photobox.co.uk/my/photo/full?photo_id=21827544159
答案 0 :(得分:0)
使用row_number()
为您的数据编号,使用lpad()
对其进行格式化,进行分层查询并使用sys_connect_by_path()
生成代码:
select t.*, sys_connect_by_path(rn, '>') code
from (select lpad(row_number() over (partition by pid order by id desc), 3, '0') rn,
id, pid
from t) t
connect by pid = prior id
start with pid is null
如果您不想输出replace(..., '>', '')
,请使用>
。
测试数据:
create table t (id varchar2(3), pid varchar2(3));
insert into t values ('x', null);
insert into t values ('y', 'x');
insert into t values ('w', 'x');
insert into t values ('z', 'y');
insert into t values ('u', 'y');
insert into t values ('o', 'w');
结果:
RN ID PID CODE
--- --- --- -----------------
001 x >001
002 w x >001>002
001 o w >001>002>001
001 y x >001>001
002 u y >001>001>002
001 z y >001>001>001
6 rows selected