我有一个看起来像这样的oracle表:
架构:
(数字)node_id
(数字)parent_id
(数字)parent_seq
表中的每个条目代表一个父/子关系。 父母可以是多个孩子的父母,一个孩子可以有多个父母(但是我们可以假设不存在任何循环,因为在提交之前已对其进行了验证)。 如果一个孩子有多个父母,那么表中对应于其node_id的行将多于一行,并且parent_seq将为每个父母递增。
现在,我不需要重建整个树,只需要知道每个节点的深度即可。 DEPTH遵循以下常见定义(树的深度和高度之间有什么区别?)
The depth of a node is the number of edges from the node to the tree's
root node.
有没有一种方法可以使用CONNECT_BY语法在Oracle中正常执行此操作?
SELECT
node_id,
MIN(level) AS best_level,
MIN(sys_connect_by_path(node_id, '/'))
keep (dense_rank FIRST ORDER BY level)
AS best_path
FROM t
START WITH parent_id IS NULL
CONNECT BY prior node_id = parent_id
GROUP BY node_id
ORDER BY 1
小提琴
我相信我在文档中找到了答案。 关键字" LEVEL"是一列,显示执行connect_by语句时的节点级别。 因此,您只需要给定节点的最大级别即可:
select node_id, max(LEVEL) from node_parent_link
CONNECT BY PRIOR node_id = parent_id
group by node_id