PostgreSQL 获取所有可能的 origin/destination 节点序列
PostgreSQL get all possible origin/destination node sequence
我有这个 PostgreSQL table 有向图的节点:
node_id | node_sequence
-----------------------
1 1
2 2
3 3
我 return 一个 table 节点之间所有可能的起始目的地序列(仅在一个方向上):
(1,2); (1,2,3); (2,3)。所以输出 table 应该是:
node_id
----
1
2
1
2
3
2
3
也许 WITH RECURSIVE 是正确的做法,但我不明白怎么做。
根据初始答案编辑:
您似乎有 2 个在问题中没有提到的约束:
- 您需要至少 2 个元素的序列
- 序列中的元素必须按升序排列且连续
这是一个简单的查询(CTE GraphNode 应该替换为您的 table):
WITH RECURSIVE GraphPath AS (
SELECT G2.Node, ARRAY[G1.Node, G2.Node] AS GraphPath /* Start with 2 elements */
FROM GraphNode G1
JOIN GraphNode G2 ON G1.Node + 1 = G2.Node
UNION ALL
SELECT N.Node, P.GraphPath || N.Node
FROM GraphNode N
JOIN GraphPath P ON N.Node = 1 + P.Node
), GraphNode AS (
SELECT UNNEST(ARRAY[1,2,3]) AS Node
)
SELECT GraphPath
FROM GraphPath
ORDER BY GraphPath
我有这个 PostgreSQL table 有向图的节点:
node_id | node_sequence
-----------------------
1 1
2 2
3 3
我 return 一个 table 节点之间所有可能的起始目的地序列(仅在一个方向上): (1,2); (1,2,3); (2,3)。所以输出 table 应该是:
node_id
----
1
2
1
2
3
2
3
也许 WITH RECURSIVE 是正确的做法,但我不明白怎么做。
根据初始答案编辑:
您似乎有 2 个在问题中没有提到的约束:
- 您需要至少 2 个元素的序列
- 序列中的元素必须按升序排列且连续
这是一个简单的查询(CTE GraphNode 应该替换为您的 table):
WITH RECURSIVE GraphPath AS (
SELECT G2.Node, ARRAY[G1.Node, G2.Node] AS GraphPath /* Start with 2 elements */
FROM GraphNode G1
JOIN GraphNode G2 ON G1.Node + 1 = G2.Node
UNION ALL
SELECT N.Node, P.GraphPath || N.Node
FROM GraphNode N
JOIN GraphPath P ON N.Node = 1 + P.Node
), GraphNode AS (
SELECT UNNEST(ARRAY[1,2,3]) AS Node
)
SELECT GraphPath
FROM GraphPath
ORDER BY GraphPath