小编典典

从节点获取所有最后一级的子级(叶)(层次查询Oracle 11G)

sql

我正在尝试并寻找 Oracle 11g数据库中的层级查询中 从节点获取所有最后一级子级(叶子)的方法

我有2个表:“节点”(具有各自值的所有节点的列表)和“关系”,它们指定父子关系:


-节点-

 ID_NODE    -      VALUE
1       3
2       6
3       9
4       2
5       4
6       5
7       2
8       7
9       8
10      1

- 关系 -

ID_FATHER    -   ID_CHILD
1       2
1       3
1       4
2       5
2       6
4       7
5       8
5       9
7       10

我已经阅读了有关CONNECT_BY_ISLEAF的信息,如果它是叶子则返回1,但是我无法像Oracle示例一样查询CONNECT_BY_ISLEAF,但我没有得到任何结果。即使我不完全知道如何使用此函数准确进行查询(例如,使用大小写条件?)

太谢谢你了!


阅读 299

收藏
2021-04-07

共1个答案

小编典典

我认为,类似的方法应该可以解决问题:

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
2021-04-07