2017-07-23 1 views
0

J'ai une table hiérarchique parent enfant. J'essaie de renvoyer une liste de tous les identifiants enfants pour chaque ID enfant. Ma table est définie comme suit:Hiérarchie parent enfant pour renvoyer tous les descendants avec l'ID principal correspondant

CREATE TABLE Organization_Hierarchy_Test (ORGANIZATION_ID INT, PARENT_ORG_ID INT); 
INSERT INTO Organization_Hierarchy_Test (ORGANIZATION_ID, PARENT_ORG_ID) 
VALUES(1,0), (2,1), (3,1), (4,2), (5,2), (6,2), (7,3), (8,3), (9,3), (10,3); 

Les résultats que je suis après ressemblerait à ceci:

+-----------------+---------------+--------------------------+ 
| ORGANIZATION_ID | PARENT_ORG_ID | ORIGINAL_ORGANIZATION_ID | 
+-----------------+---------------+--------------------------+ 
|    1 |    0 |      1 | 
|    2 |    1 |      1 | 
|    3 |    1 |      1 | 
|    4 |    2 |      1 | 
|    5 |    2 |      1 | 
|    6 |    2 |      1 | 
|    7 |    3 |      1 | 
|    8 |    3 |      1 | 
|    9 |    3 |      1 | 
|    10 |    3 |      1 | 
|    2 |    0 |      2 | 
|    3 |    0 |      2 | 
|    4 |    1 |      2 | 
|    5 |    1 |      2 | 
|    6 |    1 |      2 | 
|    7 |    1 |      2 | 
|    8 |    1 |      2 | 
|    9 |    1 |      2 | 
|    10 |    1 |      2 | 
|    4 |    0 |      4 | 
|    5 |    0 |      4 | 
|    6 |    0 |      4 | 
|    7 |    0 |      4 | 
|    8 |    0 |      4 | 
|    9 |    0 |      4 | 
|    10 |    0 |      4 | 
+-----------------+---------------+--------------------------+ 

La requête que je l'ai écrit moi obtient une liste de tous les descendants pour chaque organization_id , mais je ne peux pas comprendre comment retourner le même organization_id qui est en fait lié à tous les descendants.

J'ai essayé d'ajouter un group by et de retourner l'identifiant max avec peu de chance. J'ai une date de livraison demain et je crains de ne pas pouvoir y arriver à temps.

with descendants as 
    (select PARENT_ORG_ID, ORGANIZATION_ID, 1 as level 
    from Organization_Hierarchy_Test OH 
    union all 
    select d.PARENT_ORG_ID , OH1.ORGANIZATION_ID, d.level + 1 
    from descendants as d 
     join Organization_Hierarchy_Test OH1 on d.ORGANIZATION_ID = OH1.PARENT_ORG_ID 
) 
select ORGANIZATION_ID, PARENT_ORG_ID, level 
from descendants 
order by level, PARENT_ORG_ID, ORGANIZATION_ID 

Toutes les idées sur la façon de retourner le Organization_ID d'origine avec tous les descendants organization_id de « s? J'essaye de pousser ceci à un modèle tabulaire et cela me sauvera beaucoup de temps dans le traitement des données.

Merci beaucoup d'avance.

+0

Pourquoi le résultat souhaité avoir une ligne avec ORG_ID 2 et PARENT_ID 0? –

Répondre

0

Changer votre CTE pour inclure simplement une colonne supplémentaire d.ORGANIZATION_ID AS Orig:

with descendants as 
    (select PARENT_ORG_ID, ORGANIZATION_ID, ORGANIZATION_ID AS Orig, 1 as level 
    from Organization_Hierarchy_Test OH 
    union all 
    select d.PARENT_ORG_ID , OH1.ORGANIZATION_ID, d.ORGANIZATION_ID AS Orig, d.level + 1 
    from descendants as d 
     join Organization_Hierarchy_Test OH1 on d.ORGANIZATION_ID = OH1.PARENT_ORG_ID 
)