2017-05-05 18 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

相关问题