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

查询层级结构中指定行的所有祖先节点问题求助

看起来你把递归查询的方向搞反啦!你的原查询是从根节点(parent_id is null)开始向下遍历,然后用WHERE id=7过滤,最后只会返回目标节点自己,自然拿不到完整的祖先链。

方法1:使用CONNECT BY(Oracle专属)

要从目标节点向上追溯祖先,你需要把START WITH设为目标节点的ID,然后调整CONNECT BY的条件来指向父节点:

SELECT name 
FROM test 
START WITH id = 7  -- 从目标节点I.A.b2开始
CONNECT BY PRIOR parent_id = id;  -- 向上找父节点:上一行的parent_id等于当前行的id

这个查询会返回从目标节点到根节点的顺序:I.A.b2 → I.A.b → I.A → I。如果想要和你预期的一样(根到目标的顺序),加上ORDER BY LEVEL DESC即可:

SELECT name 
FROM test 
START WITH id = 7 
CONNECT BY PRIOR parent_id = id
ORDER BY LEVEL DESC;

执行后就能得到:

I
I.A
I.A.b
I.A.b2

方法2:使用递归CTE(通用型,支持Oracle 11g+、MySQL 8+、PostgreSQL等)

如果你的数据库支持递归公共表表达式(CTE),这种写法可读性更强,也更通用:

WITH recursive ancestors AS (
    -- 初始行:目标节点
    SELECT id, parent_id, name, 1 AS node_level
    FROM test
    WHERE id = 7
    UNION ALL
    -- 递归查询:找当前节点的父节点
    SELECT t.id, t.parent_id, t.name, a.node_level + 1
    FROM test t
    JOIN ancestors a ON t.id = a.parent_id
)
-- 按层级倒序,得到根到目标的顺序
SELECT name
FROM ancestors
ORDER BY node_level DESC;

为什么你的原查询失败?

再帮你理清楚原查询的问题:

  • START WITH parent_id is null:从所有根节点开始向下遍历
  • CONNECT BY PRIOR id = parent_id:沿着子节点的方向(父节点ID = 子节点的parent_id)往下走
  • 最后WHERE id=7:只保留遍历结果中ID为7的那一行,所以自然只有I.A.b2自己,没有祖先。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:12:17