优化 Oracle 中的层次结构查询

Optimize hierarchy query in Oracle

Table "links" 包含 2 列:PARENT_CODE、CHILD_CODE

PARENT_CODE | CHILD_CODE 
------------|------------
A1          | B1 
A1          | B2
B1          | C1 
B1          | C2 
B2          | C3 
B3          | C3
C3          | D1

这个table最终用于形成下图:

我的问题是如何在Oracle中编写优化的层次结构查询来获得连接的全图,输入参数将是任何节点。

为了说明 input/output,这是简化的 SQL: SELECT PARENT_CODE,CHILD_CODE 来自 {HIERARCHY QUERY} 其中 NODE = {ANY NODE}

下面的查询显示了所有链接。我的想法是,首先我在节点之间创建两种方式的连接。使用它我们可以进行递归查询 returns 我们的结果。最后一件事是解码 returns 谁是真实的 parent 谁是 child 基于 dir(0 - 表示原始方向,1 - 表示反向)。

with linkT (parent_code, child_code) as 
(select 'A1','B1' from dual union all
 select 'A1','B2' from dual union all
 select 'B1','C1' from dual union all
 select 'B1','C2' from dual union all
 select 'B2','C3' from dual union all
 select 'B3','C3' from dual union all
 select 'C3','D1' from dual union all
 select 'E1','F1' from dual ),
T1 as (
select parent_code, child_code, 0 Dir from linkT
union all 
select child_code, parent_code, 1 Dir from linkT )
select distinct 
       decode(dir, 0, parent_code, child_code) as Parent_code,
       decode(dir, 0, child_code, parent_code) as Child_Code
from (
select parent_code, child_code, dir
from T1 x
start with x.child_code='A1'
connect by nocycle prior x.parent_code=x.child_code ) 
order by 1,2