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

如何用单条SQL语句递归查询ID=6的行的父级历史?

递归追溯父节点的正确SQL写法

嘿,作为SQL新手碰到这种层级递归的需求确实容易懵,别担心,单条SQL语句完全可以实现你的需求,用**递归CTE(公共表表达式)**就搞定了!

问题分析

你需要从ID=6的行开始,沿着PARENT_ID向上追溯所有父节点,直到根节点(PARENT_ID为NULL)。普通的JOIN语句没法处理这种多层级的递归关联,所以你的尝试语句才会得到异常结果。

正确的SQL语句

这里以标准SQL为例(大多数主流数据库如MySQL 8+、PostgreSQL、SQL Server都支持递归CTE):

WITH RECURSIVE parent_trace AS (
    -- 锚定成员:从ID=6开始的初始记录
    SELECT ID, PARENT_ID
    FROM Table
    WHERE ID = 6
    UNION ALL
    -- 递归成员:不断关联父节点,直到PARENT_ID为NULL
    SELECT t.ID, t.PARENT_ID
    FROM Table t
    JOIN parent_trace pt ON t.ID = pt.PARENT_ID
)
SELECT ID, PARENT_ID
FROM parent_trace
ORDER BY ID DESC; -- 按ID倒序匹配你要的输出顺序

执行结果

运行这条语句后,你会得到预期的结果:

IDPARENT_ID
63
31
10
0NULL

为什么你的原语句不对?

你之前写的:

SELECT T1.ID FROM Table T1, Table T2 WHERE T1.ID = 6 OR T1.PARENT_ID = T2.PARENT_ID;

这其实是把两张表做了笛卡尔积(隐式JOIN),然后加上了一个逻辑不相关的条件,完全没有实现“递归追溯父节点”的核心逻辑,自然会得到混乱的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:20:09