5

我正在尝试并搜索在 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,而且我没有得到任何结果。即使我不确切知道如何使用此函数进行查询(例如使用案例条件?)

太感谢你了!

4

2 回答 2

12

我认为,这样的事情应该可以解决问题:

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
于 2014-02-10T08:25:10.380 回答
3

您可以简单地使用 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
于 2016-02-15T12:47:51.250 回答