Jag tycker att något sådant borde göra susen:
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
Åh, och förresten, du kan få alla blad utan att ens använda hierahical query. Välj bara alla noder, som inte är fadersnod för någon nod från relationstabellen. Något sådant:
SELECT n.* FROM NODES n
WHERE NOT EXISTS (SELECT ID_FATHER FROM RELATION r
WHERE r.id_father = n.id)
För att få lövnoderna från den angivna noden, ändra bara villkoret i START WITH-satsen, för att starta trädet omvänt från den nod du är intresserad av. Till exempel kommer denna fråga att returnera alla underordnade löv av nod med 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