使用 connect_by 获取 Oracle DB 表中树中节点的深度

Posted

技术标签:

【中文标题】使用 connect_by 获取 Oracle DB 表中树中节点的深度【英文标题】:Using connect_by to get the depth of a node in a tree in Oracle DB table 【发布时间】:2013-04-16 14:56:23 【问题描述】:

我有一个如下所示的 oracle 表:

架构:

(数字)node_id

(数字) parent_id

(number) parent_seq

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

现在,我不需要重建整个树,我只需要知道每个节点的深度即可。 DEPTH 遵循 (What is the difference between tree depth and height?) 的通用定义

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

有没有办法在 Oracle 中使用 CONNECT_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

【讨论】:

【参考方案2】:
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

fiddle

【讨论】:

以上是关于使用 connect_by 获取 Oracle DB 表中树中节点的深度的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 xPath (10g) 在 Oracle SQL extract() 中获取节点名称

oracle 正则表达的使用

云主机安装oracle

Oracle数据库安装篇

SSIS获取Oracle数据库数据

oracle数据库,对每个月份进行分类获取对应月份的对应内容,case...when... 的使用