私は、そのようなことがトリックを行うべきだと思います:
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