1

私は2つのテーブルを持っています

node
-------------
id
name

edge
--------------
source_node_id
target_node_id

クエリによる接続もあります

SELECT level,lpad(' ',4*(level)) || tn.name
FROM Node sn, Node tn, Edge e
where e.source_node_id = sn.id
and e.target_node_id = tn.id
start with e.source_node_id in (0)
connect by prior e.target_node_id = e.source_node_id
union
select 0, name
from Node n
where id in (0)

これにより、次のような出力が正しく得られます。

0    node1
1        node2
2            node3
2            node4

ここまでは順調ですね。今、私は各リーフノードの完全な階層を表示する必要があります-必要に応じて上位ノードを繰り返します...次のようなもの:

0    node1
1        node2
2            node3
0    node1
1        node2
2            node4

おそらくsys_connect_by_pathだと思いますが、よくわかりません。この種の出力の最適な生成について何か考えはありますか?

4

1 に答える 1

2

残念ながら、サンプル データは提供されておらず、憶測でしかありません。

そのため、1 つのテーブルのみを含む例を次に示します。

-- made up data 
with t1(id1, parent_id, name1) as(
  select 1, null, 'name_1' from dual union all
  select 2, 1,    'name_2' from dual union all
  select 3, 2,    'name_3' from dual union all
  select 4, 2,    'name_4' from dual

), tree as (  -- hierarchical query  
  select id1
       , parent_id
       , concat(lpad('-', level * 3, '-'), name1) as node_name
       , connect_by_isleaf is_leaf
    from t1
   start with parent_id is null
 connect by prior id1 = parent_id
 )

select node_name
   from tree

これにより、次のことが得られます。

NODE_NAME
-----------------
---name_1
------name_2
---------name_3
---------name_4

各リーフの完全な階層を表示するために、サブツリーの構築を開始します。

葉と根までずっと:

select node_name
     , row_number() over(partition by connect_by_root(t.id1) 
                         order by id1) as subtree_rn
  from tree t
 start with is_leaf = 1
connect by id1 = prior  parent_id   

結果:

NODE_NAME               SUBTREE_RN
-----------------------------------
---name_1               1
------name_2            2
---------name_3         3
---name_1               1
------name_2            2
---------name_4         3

SQLFiddle デモ

于 2013-08-17T21:19:24.523 に答える