Myślę, że coś takiego powinno wystarczyć:
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
A tak przy okazji, możesz uzyskać wszystkie liście bez użycia zapytań hierarchicznych. Wystarczy zaznaczyć wszystkie węzły, które nie są węzłem ojca dla dowolnego węzła z tabeli relacji. Coś takiego:
SELECT n.* FROM NODES n
WHERE NOT EXISTS (SELECT ID_FATHER FROM RELATION r
WHERE r.id_father = n.id)
Aby pobrać węzły liściowe z określonego węzła, wystarczy zmienić warunek w klauzuli START WITH, aby rozpocząć odwracanie drzewa od węzła, który Cię interesuje. Na przykład to zapytanie zwróci Ci wszystkie liście potomne węzła o 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