因此,由于我一直在努力寻找准确的标题,所以我认为详细的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秒钟)
答案 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
,您的查询都将得到相同的结果。