You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OracleSQL多层级父子表递归查询顶层父节点实现咨询

Oracle查询树形结构顶层父节点实现方案

方案1:使用Oracle原生CONNECT BY分层查询(推荐,性能更优)

这是Oracle特有的树形查询语法,适配所有Oracle版本,写法简洁:

SELECT 
  CONNECT_BY_ROOT id AS input_id,
  id AS top_parent_id
FROM entry
WHERE CONNECT_BY_ISLEAF = 1
START WITH id IN (6, 3) -- 此处替换为你需要查询的ID列表
CONNECT BY PRIOR parent_id = id;

逻辑说明

  • START WITH id IN (...) 指定递归的起始节点,即你输入的待查询ID
  • CONNECT BY PRIOR parent_id = id 定义递归规则:以上一层节点的parent_id作为当前层的id,也就是沿着父节点方向向上递归
  • CONNECT_BY_ROOT id 保留递归起始的输入ID,方便你对应查询结果和输入ID的关系
  • CONNECT_BY_ISLEAF = 1 过滤出递归路径的最顶层节点:因为向上递归到PARENT_ID为null的节点时没有上层节点,在该递归结构中属于叶子节点,就是你要的顶层父节点

方案2:使用标准SQL递归CTE(适配Oracle 11gR2及以上版本)

如果你需要兼容其他SQL标准数据库,或者更偏好可读性强的通用写法,可以用递归CTE实现:

WITH entry_hierarchy AS (
  -- 递归初始层:拿到所有待查询的初始ID
  SELECT 
    id AS input_id,
    id,
    parent_id
  FROM entry
  WHERE id IN (6, 3) -- 此处替换为你需要查询的ID列表
  UNION ALL
  -- 递归层:不断向上关联父节点
  SELECT 
    eh.input_id,
    e.id,
    e.parent_id
  FROM entry_hierarchy eh
  INNER JOIN entry e ON eh.parent_id = e.id
  WHERE eh.parent_id IS NOT NULL -- 已经到顶层的节点不再递归
)
-- 过滤出每个输入ID对应的顶层父节点
SELECT 
  input_id,
  id AS top_parent_id
FROM entry_hierarchy
WHERE parent_id IS NULL;

逻辑说明

递归CTE会先拿到你输入的所有ID作为初始节点,之后每次循环都用当前节点的parent_id关联父节点,直到没有父节点为止,最后过滤出PARENT_ID为null的记录就是对应输入ID的顶层父节点。

注:你的业务规则已经保证了不存在环形关联、一个节点多个父节点的情况,上述两种方案都不需要额外加去重、防死循环逻辑,直接使用即可。
按你的示例测试:输入ID为6、3时,返回结果为input_id=6对应top_parent_id=4,input_id=3对应top_parent_id=1,完全符合需求。

内容的提问来源于stack exchange,提问作者eixcs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:36:06