0

我有一个看起来像这样的 oracle 表:

架构:

(数字)node_id

(数字) parent_id

(数字) parent_seq

表中的每个条目代表一个父/子关系。一个父级可以是多个子级的父级,一个子级可以有多个父级(但我们可以假设不存在循环,因为在提交之前已验证)。如果一个孩子有多个父母,那么它在表中将有不止一行对应于它的 node_id,并且 parent_seq 将为每个父母增加。

现在,我不需要重建整个树,我只需要知道每个节点的深度即可。DEPTH 遵循以下通用定义(树的深度和高度有什么区别?

节点的深度是从节点到树根节点的边数。

有没有办法在 Oracle 中使用 CONNECT_BY 语法优雅地做到这一点?

4

2 回答 2

1

我相信我在文档中找到了答案。关键字“LEVEL”是在执行 connect_by 语句时显示节点级别的列。因此,您只需要给定节点的最大级别:

select node_id, max(LEVEL) from node_parent_link CONNECT BY PRIOR node_id = parent_id group by node_id

于 2013-04-16T15:10:00.077 回答
1
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

小提琴

于 2013-04-16T15:15:19.977 回答