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