輸出

2013-08-17 49 views
1

複製整個CONNECT BY分支我有兩個表輸出

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

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

我也有一個CONNECT BY查詢

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 - 但即使不能肯定。關於這種輸出的最優生成的任何想法?

+2

請將您所提供的兩個表中的實際數據的樣本不錯。此外,如果您已經準備好[SQLFiddle](http://www.sqlfiddle.com/#!4),它會更好。 –

回答

2

不幸的是,並沒有提供樣本數據,只能推測。

所以這裏僅包括一個表中的例子:

-- 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 Demo