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 (...)指定递归的起始节点,即你输入的待查询IDCONNECT 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
相关产品推荐
相关产品推荐

