Oracle-遍历分层记录

时间:2019-06-20 15:15:48

标签: sql oracle loops hierarchical-data

因此,由于我一直在努力寻找准确的标题,所以我认为详细的Shema将更容易理解。

我有此表PROGRAM,为简单起见,我将减少到3个字段:

ID |NAME    |ID_ORIGINAL_PROGRAM
1  |name_1  |
2  |name_2  |1
3  |name_3  |1
4  |name_4  |2
5  |name_5  |3      
6  |name_6  |
7  |name_7  |6

我正在尝试找到一个查询,该查询将允许我使用任何ID作为参数来收集所有与此ID相关的程序。 而且我需要能够发送参数,而不必一定是层次结构的“父亲” ID。

例如,如果参数ID为1,则结果将为:

ID
2
3
4
5

如果参数ID为4,则结果将为:

ID
1
2
3
5

似乎我缺少某种我无法清楚识别的“循环”逻辑。 我抬头看了一下“按优先级连接”,但对概念的理解不足以理解如何部署它。

编辑: 所以看来我找到了一种方法:

    SELECT ID
      FROM PROGRAM
START WITH ID = 67256
CONNECT BY NOCYCLE ID_ORIGINAL_PROGRAM = PRIOR ID
                   OR ID = PRIOR ID_ORIGINAL_PROGRAM
order by ID

尽管如此,我还是有点担心表演(表演需要1秒钟)

1 个答案:

答案 0 :(得分:1)

我想你需要

with program( id, id_original_program ) as
(
 select 1, null from dual union all
 select 2, 1    from dual union all
 select 3, 1    from dual union all
 select 4, 2    from dual union all
 select 5, 3    from dual union all
 select 6, null from dual union all
 select 7, 6    from dual 
)
 select id, sys_connect_by_path(id, '->') as path
   from program
  where id_original_program is not null 
 connect by prior id =  id_original_program
 start with id = 1 -- 4
 order by id;

ID  PATH
2   ->1->2
3   ->1->3
4   ->1->2->4
5   ->1->3->5

如果替换了值4,则得到

ID  PATH
4   ->4

仅。

无论您替换1还是4,您的查询都将得到相同的结果。