2017-05-05 18 views
0

私はhierarchical dataを以下の構造で持っています。レベルは1から6までです。したがって、6つの結合を実行して合体するのではなく、トップレベルの親(parent_nrを持たない)を見つけるにはどうすればいいですか。各レコードが属するトップレベルの親グループを見つける

enter image description here

私は

SELECT 
    aa.code_nr, 
    aa.parent_nr, 
    CONNECT_BY_ROOT aa.code_nr AS "Top Level ID" 
FROM mytable_t aa 
CONNECT BY PRIOR aa.code_nr = aa.parent_nr 
; 

answer hereを受け入れて試してみたが、それは唯一の "トップレベルID" と私に次のレベルを与えず、最終的なレベル(A)

enter image description here

答えて

1

Oracle Setup

CREATE TABLE my_table (code_nr, parent_nr) AS (
    SELECT 'A', NULL FROM DUAL UNION ALL 
    SELECT 'A.1', 'A' FROM DUAL UNION ALL 
    SELECT 'A.1.1', 'A.1' FROM DUAL UNION ALL 
    SELECT 'A.1.1.1', 'A.1.1' FROM DUAL UNION ALL 
    SELECT 'A.1.1.2', 'A.1.1' FROM DUAL UNION ALL 
    SELECT 'A.1.1.1.1', 'A.1.1.1' FROM DUAL UNION ALL 
    SELECT 'A.1.1.2.1', 'A.1.1.2' FROM DUAL UNION ALL 
    SELECT 'A.1.1.2.2', 'A.1.1.2' FROM DUAL; 

クエリ

SELECT LEVEL, 
     code_nr AS root_code_nr, 
     CONNECT_BY_ROOT(code_nr) AS code_nr 
FROM my_table 
WHERE CONNECT_BY_ISLEAF = 1 
CONNECT BY PRIOR parent_nr = code_nr; 

出力

LEVEL ROOT_CODE CODE_NR 
----- --------- --------- 
    1 A   A   
    2 A   A.1  
    3 A   A.1.1  
    4 A   A.1.1.1 
    5 A   A.1.1.1.1 
    4 A   A.1.1.2 
    5 A   A.1.1.2.1 
    5 A   A.1.1.2.2 
0

次の操作を試みることができる:この回答のため

SELECT 
    aa.code_nr, 
    aa.parent_nr, 
    substr(SYS_CONNECT_BY_PATH(aa.code_nr, '/'),2,instr(SYS_CONNECT_BY_PATH(aa.code_nr, '/'),'/')) 
FROM mytable_t aa 
CONNECT BY PRIOR aa.code_nr = aa.parent_nr 
; 
+0

感謝を。もう少しシンプルだからもう一つは選んだ。 – philshem

関連する問題