Postgres получает всю возможную последовательность узлов отправления / назначения - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть эта таблица Postgres с узлом ориентированного графа:

node_id | node_sequence 
-----------------------
   1           1
   2           2 
   3           3 

Я бы вернул таблицу со всей возможной последовательностью назначения источника (только в одном направлении) между узлом: (1,2); (1,2,3); (2,3).Таким образом, выходная таблица должна быть:

node_id
 ----
   1
   2
   1
   2
   3
   2
   3

, возможно, с RECURSIVE это правильно, но я не могу понять, как.

спасибо большое

1 Ответ

0 голосов
/ 16 ноября 2018

Редактировать с первоначального ответа :
У вас, кажется, есть 2 ограничения, которые вы не упомянули в своем вопросе:

  • Вы хотите последовательности по крайней мере из 2 элементов
  • Элементы в последовательности должны быть в порядке возрастания и последовательно

Вот простой запрос, который это делает (CTE GraphNode следует заменить на вашу таблицу):

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
...