Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

obter TODOS os filhos de último nível (folhas) de um nó (consultas hierárquicas Oracle 11G)


Eu acho que algo assim deve fazer o truque:
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, e a propósito, você pode obter todas as folhas sem usar a consulta hierárquica. Basta selecionar todos os nós, que não são o nó do pai para qualquer nó da tabela de relações. Algo parecido:
SELECT n.* FROM NODES n
WHERE NOT EXISTS (SELECT ID_FATHER FROM RELATION r
                  WHERE r.id_father = n.id)

Para obter os nós folha do nó especificado, basta alterar a condição na cláusula START WITH, para iniciar a árvore reversa do nó em que você está interessado. Por exemplo, esta consulta retornará todas as folhas filhas do nó com 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