Sql 从一个节点(Oracle11g的层次结构查询)获取所有末级子节点(leaf)

Sql 从一个节点(Oracle11g的层次结构查询)获取所有末级子节点(leaf),sql,oracle11g,recursive-query,hierarchical-query,Sql,Oracle11g,Recursive Query,Hierarchical Query,我正在尝试并搜索如何在Oracle11g数据库中的一个分层查询中从一个节点获取所有最后一级的子叶 我有两个表:节点所有节点及其各自值的列表,以及指定父子关系的关系: -节点- -关系- 我读过关于CONNECT\u BY\u ISLEAF的文章,如果它是一个叶子,它将返回1,但是我不能像Oracle示例那样查询CONNECT\u BY\u ISLEAF,并且我没有得到任何结果。即使我不知道如何使用case-condition这个函数进行精确的查询 太谢谢你了 我认为,像这样的事情应该会奏效: S

我正在尝试并搜索如何在Oracle11g数据库中的一个分层查询中从一个节点获取所有最后一级的子叶

我有两个表:节点所有节点及其各自值的列表,以及指定父子关系的关系:

-节点- -关系- 我读过关于CONNECT\u BY\u ISLEAF的文章,如果它是一个叶子,它将返回1,但是我不能像Oracle示例那样查询CONNECT\u BY\u ISLEAF,并且我没有得到任何结果。即使我不知道如何使用case-condition这个函数进行精确的查询


太谢谢你了

我认为,像这样的事情应该会奏效:

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)
为了从指定的节点获取叶节点,只需更改STARTWITH子句中的条件,即可从感兴趣的节点开始树反转。例如,此查询将返回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

您只需使用CONNECT_BY_ISLEAF即可

SELECT n.id, n.val
FROM NODES n 
LEFT JOIN RELATION r ON (n.id = r.id_child)
WHERE CONNECT_BY_ISLEAF = 1
CONNECT BY PRIOR n.id = r.id_father
START WITH r.id_father IS NULL

非常感谢您的answe,但以您的方式,您获得了所有树的所有最后一级子级,我只想要来自选定节点的最后一级子级。我不知道获得它的条件。很抱歉,我无法投票给您,因为我没有足够的声誉。下次谢谢你!
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
SELECT n.id, n.val
FROM NODES n 
LEFT JOIN RELATION r ON (n.id = r.id_child)
WHERE CONNECT_BY_ISLEAF = 1
CONNECT BY PRIOR n.id = r.id_father
START WITH r.id_father IS NULL