Мисля, че нещо подобно би трябвало да свърши работа:
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
О, и между другото, можете да получите всички листа, без дори да използвате йерархична заявка. Просто изберете всички възли, които не са бащин възел за който и да е възел от релационната таблица. Нещо подобно:
SELECT n.* FROM NODES n
WHERE NOT EXISTS (SELECT ID_FATHER FROM RELATION r
WHERE r.id_father = n.id)
За да получите листовите възли от посочения възел, просто променете условието в клаузата START WITH, за да започнете обръщането на дървото от възела, който ви интересува. Например, тази заявка ще ви върне всички дъщерни листа на възел с 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