2017-05-05 5 views
0

J'ai la structure hierarchical data avec la structure suivante. Les niveaux sont compris entre 1 et 6, donc au lieu de faire 6 jointures, puis coalesce, comment puis-je trouver quel est le parent de premier niveau (qui n'a pas de parent_nr).Recherchez le groupe parent de premier niveau auquel appartient chaque enregistrement

enter image description here

J'ai essayé l'answer here accepté,

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 
; 

mais il me donne seulement le niveau de "niveau supérieur ID" et non le niveau final (A)

enter image description here

Répondre

1

Configuration Oracle:

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; 

Recherche:

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; 

Sortie:

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

Vous pouvez essayer ce qui suit:

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

Merci pour cette réponse. J'ai choisi l'autre parce que c'est un peu plus simple. – philshem