使用 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 表中树中节点的深度的主要内容,如果未能解决你的问题,请参考以下文章