2017-05-05 19 views
0

我有hierarchical data,結構如下。級別是1到6,所以不要做6個連接然後合併,我怎麼才能找到什麼是頂級父級(沒有parent_nr)。找到每個記錄所屬的頂級父組

enter image description here

我試着接受answer 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 
; 

,但它只是給了我一個新的水平 「最高級別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

相關問題