Jeg synes, sådan noget burde gøre tricket:
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, og forresten, du kan få alle blade uden selv at bruge hierahisk forespørgsel. Vælg blot alle noder, som ikke er fars node for nogen node fra relationstabellen. Sådan noget:
SELECT n.* FROM NODES n
WHERE NOT EXISTS (SELECT ID_FATHER FROM RELATION r
WHERE r.id_father = n.id)
For at få bladknuderne fra den angivne node, skal du blot ændre betingelsen i START WITH-klausulen for at starte træet omvendt fra den node, du er interesseret i. For eksempel vil denne forespørgsel returnere dig alle underordnede blade af node 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