Ik denk dat zoiets zou moeten werken:
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, en trouwens, je kunt alle bladeren krijgen zonder zelfs maar een hiërahische zoekopdracht te gebruiken. Selecteer gewoon alle knooppunten die niet het knooppunt van de vader zijn voor een knooppunt uit de relatietabel. Zoiets:
SELECT n.* FROM NODES n
WHERE NOT EXISTS (SELECT ID_FATHER FROM RELATION r
WHERE r.id_father = n.id)
Om de bladknooppunten van het opgegeven knooppunt te krijgen, wijzigt u gewoon de voorwaarde in de START WITH-clausule, om de boom omgekeerd te starten vanaf het knooppunt waarin u bent geïnteresseerd. Deze query geeft u bijvoorbeeld alle onderliggende bladeren van het knooppunt met 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