如何在PostgreSQL中按链表结构顺序遍历查询表数据
链表结构存储表的顺序遍历查询方案
你当前使用链表结构存储的表示例数据如下:
| unique_id | next | |-----------|-------| | 1 | 3 | | 2 | null | | 3 | 2 |
- 字段规则:
unique_id:行数据唯一标识next:当前节点指向的下一个节点的unique_id,值为null时代表链表尾节点
- 配套元数据表:
headTable存储链表的头节点ID,示例里头节点为uId=1 - 需求:从
headTable取头节点后,按1->3->2的链表指向顺序遍历全量节点,返回有序行数组,预期输出格式如下:
[{unique_id:1, next:3},{unique_id:3, next:2},{unique_id:2, next:null}]
注:因渲染限制,示例表以代码块形式展示。
实现方式
支持递归CTE的数据库(MySQL 8.0+、PostgreSQL、SQL Server 等)
递归公用表达式(CTE)是实现这类层级/链表结构遍历最简洁的方案,代码如下:
WITH RECURSIVE cte AS ( -- 锚点:查询头节点作为遍历起点 SELECT t.unique_id, t.next, 1 as sort_idx FROM linked_table t -- 替换为你实际的链表表名 INNER JOIN headTable h ON t.unique_id = h.uId UNION ALL -- 递归:根据上一节点的next关联下一个节点 SELECT t.unique_id, t.next, cte.sort_idx + 1 as sort_idx FROM linked_table t INNER JOIN cte ON t.unique_id = cte.next WHERE cte.next IS NOT NULL -- 遇到尾节点终止递归 ) SELECT unique_id, next FROM cte ORDER BY sort_idx;
执行上述SQL后会按链表顺序返回结果集,直接在程序端将结果集转为数组即可匹配预期输出格式。
边界处理
如果你的链表可能存在环(节点回指之前的遍历节点),可以在递归关联时加重复校验避免无限递归:
WHERE cte.next IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM cte tmp WHERE tmp.unique_id = t.unique_id )
不支持递归CTE的低版本数据库(如MySQL 5.x)
低版本没有递归CTE能力,可以通过存储过程实现循环遍历:
- 新建临时表存储遍历结果
- 先查询头节点写入临时表
- 循环根据上一节点的next值查询下一节点,写入临时表,直到next为null时终止循环
- 查询临时表按写入顺序返回结果即可
内容的提问来源于stack exchange,提问作者era s'q
相关产品推荐
相关产品推荐

