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

obtenir TOUS les enfants de dernier niveau (feuilles) d'un nœud (requêtes hiérarchiques Oracle 11G)

Je pense que quelque chose comme ça devrait faire l'affaire :

SELECT * FROM
(SELECT n.id, n.val, CONNECT_BY_ISLEAF isleaf FROM NODES n 
       LEFT JOIN RELATION r ON n.id = r.id_child
CONNECT BY PRIOR n.id = r.id_father
START WITH r.id_father IS NULL)
WHERE isleaf = 1

Oh, et au fait, vous pouvez obtenir toutes les feuilles sans même utiliser de requête hiérarchique. Sélectionnez simplement tous les nœuds, qui ne sont pas le nœud du père pour n'importe quel nœud de la table de relation. Quelque chose comme ça :

SELECT n.* FROM NODES n
WHERE NOT EXISTS (SELECT ID_FATHER FROM RELATION r
                  WHERE r.id_father = n.id)

Afin d'obtenir les nœuds feuilles du nœud spécifié, modifiez simplement la condition dans la clause START WITH, pour démarrer l'arbre inverse à partir du nœud qui vous intéresse. Par exemple, cette requête vous renverra toutes les feuilles enfants du nœud avec id =5 :

SELECT * FROM
(SELECT n.id, n.val, CONNECT_BY_ISLEAF isleaf FROM NODES n 
       LEFT JOIN RELATION r ON n.id = r.id_child
CONNECT BY PRIOR n.id = r.id_father
START WITH n.id = 5)
WHERE isleaf = 1