如何用单条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倒序匹配你要的输出顺序
执行结果
运行这条语句后,你会得到预期的结果:
| ID | PARENT_ID |
|---|---|
| 6 | 3 |
| 3 | 1 |
| 1 | 0 |
| 0 | NULL |
为什么你的原语句不对?
你之前写的:
SELECT T1.ID FROM Table T1, Table T2 WHERE T1.ID = 6 OR T1.PARENT_ID = T2.PARENT_ID;
这其实是把两张表做了笛卡尔积(隐式JOIN),然后加上了一个逻辑不相关的条件,完全没有实现“递归追溯父节点”的核心逻辑,自然会得到混乱的结果。
内容的提问来源于stack exchange,提问作者dwwork
相关产品推荐
相关产品推荐

