postgresql 在Postgres中表示单链表并获取特定节点的所有先前节点

k3fezbri  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(58)

我有一个表示链表的表

CREATE TABLE linked_list (
  node_id INTEGER PRIMARY KEY,
  next_node_id INTEGER
);

INSERT INTO linked_list VALUES
  (1, 2),
  (2, 3),
  (3, NULL);

字符串
它可能包含其他数据,例如(4,NULL),(5,6),(6,7)。但我试图找出如何使它在简化的形式。
我尝试编写一个PostgreSQL的SQL查询来获取指定节点之前的所有节点,例如3 -> [1,2]
我想这可能是用recursive函数实现的。但我所有的尝试都导致空结果或帮助获取前一个节点。(例如2 for 3)
我的最后一次尝试看起来像这样,从我的Angular 来看有点奇怪:

SELECT node_id, linked_node_ids FROM linked_list,
(WITH RECURSIVE linked_nodes AS (
  SELECT node_id, next_node_id FROM linked_list WHERE node_id = 3

  UNION ALL

  SELECT ll.node_id, ll.next_node_id FROM linked_list ll
  JOIN linked_nodes ln ON ll.next_node_id = ln.node_id
  WHERE ll.node_id != 3
)
SELECT array_remove(ARRAY_AGG(CASE WHEN node_id = 3 THEN NULL ELSE node_id END), NULL) AS linked_node_ids FROM linked_nodes) WHERE node_id=3;


任何提示如何使它更简单或性能是受欢迎的。

wydwbb8l

wydwbb8l1#

尝试使用以下查询,该查询使用递归CTE从指定节点以逆序遍历链表,将所有前面节点的IDs累积到数组中。

WITH RECURSIVE traverse AS (
    SELECT node_id, next_node_id, ARRAY[node_id] AS path
    FROM linked_list
    WHERE node_id = 1 

    UNION ALL

     SELECT ll.node_id, ll.next_node_id, path || ll.node_id
    FROM linked_list ll
    INNER JOIN traverse t ON t.next_node_id = ll.node_id
)
SELECT array_remove(path, 3) AS previous_nodes  
FROM traverse
WHERE node_id = 3;

字符串

相关问题