Oracle
 sql >> Base de données >  >> RDS >> Oracle

Trouver le nœud le plus enfant d'un parent (n'importe quel niveau) dans Oracle

Par "nœud le plus enfant", je suppose que vous entendez les nœuds feuilles de l'arbre. Vous pouvez déterminer les nœuds feuilles avec le CONNECT_BY_ISLEAF pseudo-colonne d'une hiérarchie (CONNECT BY ) requête.

Étant donné vos exemples de données dans une table, la requête suivante donne les résultats souhaités :

select connect_by_root id id
     , parent_did
  from table1
 where connect_by_isleaf = 1
connect by id = prior parent_did
  start with id in ('a','b','c');

| ID | PARENT_DID |
|----|------------|
|  a |          f |
|  a |          g |
|  a |          h |
|  b |          f |
|  b |          g |
|  b |          h |
|  c |          f |

SQL Fiddle

En tenant compte de vos données mises à jour et de vos exigences, y compris le fait qu'une deuxième table contient a, b et c comme conditions de départ :

select connect_by_root parent_id parent_id
     , id
  from table1
 where connect_by_isleaf = 1
connect by prior id = parent_id
  start with parent_id in (select id from table2)

| PARENT_ID | ID |
|-----------|----|
|         a |  f |
|         a |  g |
|         a |  h |
|         b |  f |
|         b |  g |
|         b |  h |
|         c |  f |

SQL Fiddle Vous pouvez en savoir plus sur les requêtes hiérarchiques dans la documentation .