查询层级结构中指定行的所有祖先节点问题求助
看起来你把递归查询的方向搞反啦!你的原查询是从根节点(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
相关产品推荐
相关产品推荐

