Oracle
 sql >> Database >  >> RDS >> Oracle

ottenere TUTTI i bambini di ultimo livello (foglie) da un nodo (query gerarchiche Oracle 11G)

Penso che qualcosa del genere dovrebbe fare il trucco:

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, a proposito, puoi ottenere tutte le foglie senza nemmeno usare la query gerarchica. Basta selezionare tutti i nodi, che non sono il nodo padre per nessun nodo dalla tabella delle relazioni. Qualcosa del genere:

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

Per ottenere i nodi foglia dal nodo specificato, basta modificare la condizione nella clausola START WITH, per avviare l'albero inverso dal nodo che ti interessa. Ad esempio, questa query ti restituirà tutte le foglie figli 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