2016-10-27 8 views
1

階層的なクエリを実行して、 "センター"とそのすべての親(最大5つの親行)を選択する必要があります。ビジネス上の理由から6行でなければならないので、私のセンターには2人しかいない場合は、実際のセンターでテーブルを完成させる必要があります。 私はこれで最初の部分達成:階層的なクエリの問題

SELECT centro as center, nodo as node , nodo_padre as father_node, 
level as Lvl 
FROM BUP01.NODOTREE 
where rownum < 7 
START WITH NODO = 35250453 
CONNECT BY NODO= PRIOR NODO_PADRE 
order by lvl desc 

をそして、この取得:

|CENTER | NODE    | FATHER_NODE   |  LVL| 
|----------| --------------------| --------------------| ----------| 
|000-101 | 1     | 0     |   3| 
|000-102 | 25974018   | 1     |   2| 
|000-107 | 35250453   | 25974018   |   1| 

をしかし、私は次の結果スロークエリを実行する必要があります。

|CENTER  |NODE     |FATHER_NODE   |  LVL| 
|---------- |-------------------- |--------------------| ----------| 
|000-101 |1     |0     |   6| 
|000-102 |25974018    |1     |   5| 
|000-107 |35250453    |25974018   |   4| 
|000-107 |35250453    |25974018   |   3| 
|000-107 |35250453    |25974018   |   2| 
|000-107 |35250453    |25974018   |   1| 
+0

*を*入力データの例を示してください。 – OldProgrammer

+0

なぜあなたはその結果を望んでいる/必要としていますか? 'START WITH NODO = 35250453 'なら、あなたはその行をレベル1でしか得ることができません。あなたが**' START WITH NODO = ...'ではなく**可能な限りノードを持ち、そのノードを持つ行だけを保持します。 "望ましい結果"からは、これは実際には木ではなく、むしろ "竹の茎"(各親にはちょうど1人の子供がいる)のように見えます。あなたは解決しようとしている問題は何ですか?ソリューションの一部になると思いますか?どういうわけか、これは問題への正しいアプローチのようには感じません。 – mathguy

答えて

1
with t as 
(
    SELECT   centro as center, nodo as node , nodo_padre as father_node, level as Lvl 
    FROM   NODOTREE 
    START WITH  NODO = 35250453 
    CONNECT BY  NODO = PRIOR NODO_PADRE 
       and level <= 6 
) 

select   center,node,father_node,lvl+(6-count(*) over()) as lvl 

from   t 

union all 

select   center,node,father_node,level as lvl 

from   (SELECT centro as center, nodo as node , nodo_padre as father_node 
       FROM  NODOTREE 
       where  NODO = 35250453 
         and 6 - (select count (*) from t) > 0 
       ) 

connect by  level <= 6 - (select count (*) from t) 

order by  lvl desc 
; 
+0

完璧に動作します!本当にありがとう! –

+0

@GonzaloBritez、あなたの質問に答えたので、正解とマークしてください。 –