2016-09-19 13 views
0

で下位階層私は、私は外の階層を引く必要があること(OK、それはCTEだ)テーブルを持っている代わりに、PARENT_IDのを除いて、私は子供-IDを持っている...オラクル

例えば

Rule_ID | Group_Name | Function_ID | Info | Child_ID 
1   'ABC'  1    '1blah' 0 
1   'ABC'  2    '2blah' 3 
2   'ABC'  5    '5blah' 0 
2   'ABC'  6    '6blah' 7 
null  'ABC'  7    '7blah' 11 
null  'ABC'  11   '11blah' 0 

もう1つの問題は、function_idがグループの一部として一意であり、Rule_idが子に表示されず、これがn番目のレベルであることです。すなわち、Function_ID = 3が存在する間、同じRule_IDを持たない。私は必要なもの

は次のとおりです。

Rule_ID | Group_Name | Function_ID | Info 
1   'ABC'  1    '1blah' 
1   'ABC'  2    '2blah' 
1   'ABC'  3    '3blah' 
2   'ABC'  5    '5blah' 
2   'ABC'  6    '6blah' 
2   'ABC'  7    '7blah' 
2   'ABC'  11   '11blah' 

私は、標準階層の機能を試してみたが、それらはすべてPARENT_ID、ないChild_IDに基づいて動作するようです。

誰も私をまっすぐに設定できますか?私はこれは私がそれをすることの少ない不格好な方法があるかなり確信しているが、あなたは、必要なものをやるだろうと思い

+0

これは明らかです。 「希望の」出力には、Infoが「3blah」の行があります。入力の[情報]列にはそのような値はありません。その価値はどこから生じたのですか?次に、あなたの入力の下に記述する内容は、(少なくとも私にとって)泥のようにはっきりしています - あなたはどういう意味ですか?なぜすべてが重要なのでしょうか?私は確信していますが、あなたはどのように説明していません。 – mathguy

答えて

1

...

WITH sample_data AS (SELECT 1 rule_id, 'ABC' group_name, 1 function_id, '1blah' info, 0 child_id FROM dual UNION ALL 
        SELECT 1 rule_id, 'ABC' group_name, 2 function_id, '2blah' info, 3 child_id FROM dual UNION ALL 
        SELECT 2 rule_id, 'ABC' group_name, 5 function_id, '5blah' info, 0 child_id FROM dual UNION ALL 
        SELECT 2 rule_id, 'ABC' group_name, 6 function_id, '6blah' info, 7 child_id FROM dual UNION ALL 
        SELECT NULL rule_id, 'ABC' group_name, 3 function_id, '3blah' info, 0 child_id FROM dual UNION ALL 
        SELECT NULL rule_id, 'ABC' group_name, 7 function_id, '7blah' info, 11 child_id FROM dual UNION ALL 
        SELECT NULL rule_id, 'ABC' group_name, 11 function_id, '11blah' info, 0 child_id FROM dual) 
SELECT sd1.rule_id, 
     sd1.group_name, 
     sd1.function_id, 
     (SELECT info FROM sample_data sd2 WHERE sd2.function_id = sd1.function_id) info 
FROM (SELECT rule_id, 
       group_name, 
       connect_by_root(function_id) function_id, 
       connect_by_isleaf isleaf 
     FROM sample_data sd 
     CONNECT BY PRIOR function_id = child_id 
        AND PRIOR group_name = group_name) sd1 
WHERE isleaf = 1 
ORDER BY rule_id, function_id; 

    RULE_ID GROUP_NAME FUNCTION_ID INFO 
---------- ---------- ----------- ------ 
     1 ABC     1 1blah 
     1 ABC     2 2blah 
     1 ABC     3 3blah 
     2 ABC     5 5blah 
     2 ABC     6 6blah 
     2 ABC     7 7blah 
     2 ABC     11 11blah 

注意:列が標識されているという理由だけで「child_id」のdoesnそれは親のIDにすることはできません...あなたの頭の中に物事を再ラベルする必要があります

+0

OPの入力にsample_data(最初の行にNULL rul​​e_dが含まれています)の5行目を持つことを意図していることを知りましたか?私はそこにそれを見ない。 – mathguy

+0

はい、OPによると、「Function_ID = 3は存在しますが、同じRule_IDを持っていません」 – Boneist

+0

パーフェクトです。あなたが言ったように、@ボニスト、私はそれの論理にぶら下がった。 – JohnHC