sql >> Base de Datos >  >> RDS >> Oracle

obtenga TODOS los elementos secundarios del último nivel (hojas) de un nodo (consultas jerárquicas Oracle 11G)

Creo que algo como eso debería funcionar:

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

Ah, y por cierto, puede obtener todas las hojas sin siquiera usar la consulta jerárquica. Simplemente seleccione todos los nodos, que no sean el nodo del padre para ningún nodo de la tabla de relaciones. Algo así:

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

Para obtener los nodos hoja del nodo especificado, simplemente cambie la condición en la cláusula INICIO CON, para iniciar el árbol inverso desde el nodo que le interesa. Por ejemplo, esta consulta le devolverá todas las hojas secundarias del nodo con 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