我有一个表示链表的表
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;
型
任何提示如何使它更简单或性能是受欢迎的。
1条答案
按热度按时间wydwbb8l1#
尝试使用以下查询,该查询使用递归
CTE
从指定节点以逆序遍历链表,将所有前面节点的IDs
累积到数组中。字符串