PostgreSQL递归查询获取全量关联数字链返回结果不全问题求解
PostgreSQL 无向关联节点全量查询实现方案
你的需求本质是无向图连通分量提取:表T中A、B两列构成无向边,只要两个值出现在同一行就算关联,需要查询指定起始值所在连通分量的全部节点。
原有写法问题说明
- 第一版查询逻辑缺陷:递归分支仅返回B列的数值,当关联条件匹配到T表B列等于当前集合值时,对应的A列新增值(样例中的26、2)未被返回,导致链式关联中断。
- 第二版语法不符合规范:PostgreSQL 递归CTE不允许在递归分支中多次引用递归临时表,因此无法执行。
正确实现代码
WITH RECURSIVE connected_nodes AS ( -- 基准节点:放入起始查询值 SELECT 55 AS val UNION -- 递归匹配:每次返回当前关联边的对端值 SELECT CASE WHEN t.A = cn.val THEN t.B ELSE t.A END AS val FROM T t JOIN connected_nodes cn ON t.A = cn.val OR t.B = cn.val ) -- 输出去重后的全量关联值 SELECT DISTINCT val FROM connected_nodes;
逻辑说明
- 递归初始阶段先将起始值55加入结果集合
- 每次递归时,用当前集合的所有值和T表的A、B列做匹配,返回匹配成功的边的对端数值,自动加入结果集合
- 递归会自动执行直到没有新的数值可以加入,最终返回的就是完整的全量关联集合
如果数据量较大,建议给A、B列分别建立索引,可大幅提升查询性能。
内容的提问来源于stack exchange,提问作者sten
相关产品推荐
相关产品推荐

