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

如何在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能力,可以通过存储过程实现循环遍历:

  1. 新建临时表存储遍历结果
  2. 先查询头节点写入临时表
  3. 循环根据上一节点的next值查询下一节点,写入临时表,直到next为null时终止循环
  4. 查询临时表按写入顺序返回结果即可

内容的提问来源于stack exchange,提问作者era s'q

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:57:32