编写一个分层查询,在Oracle PL SQL中生成特定的系统代码

时间:2017-10-03 10:37:17

标签: sql oracle

我尝试在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

1 个答案:

答案 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