Я пытаюсь написать запрос SQL, который будет извлекать все строки (со всеми их полями) ориентированного графа по идентификатору отдельной строки.
Моя структура выглядит следующим образом:
- таблица: транзакция
- таблица: отношение транзакций
- столбец: left_id
- col: right_id
Как будет выглядеть оптимальная функция, особенно с некоторым рекурсивным пределом?
Это мой текущая попытка. Идентификатор жестко закодирован. Я делаю массив всех задействованных идентификаторов путем рекурсивного обхода графа, и я заканчиваю, получая полные строки из массива идентификаторов. Но кажется, что я не получаю все узлы, он будет только выбирать все левые узлы + все правые узлы, игнорируя при этом правые узлы левых элементов и левые узлы правых элементов.
WITH RECURSIVE search_graph (path, last_left_id, last_right_id) AS (
SELECT
ARRAY [id],
id,
id
FROM
"transaction"
WHERE
id = '2fc798f7-bb87-4b27-8bbf-8721ba2ea1f8'
UNION
ALL
SELECT
sg.path || e.right_id || e.left_id,
e.left_id,
e.right_id
FROM
search_graph sg
JOIN "transaction_relation" e ON (
e.left_id = sg.last_right_id
AND NOT path @> ARRAY [e.right_id]
)
OR(
e.right_id = sg.last_left_id
AND NOT path @> ARRAY [e.left_id]
)
)
SELECT
nr.*
FROM
(
SELECT
DISTINCT unnest(path) as id
FROM
search_graph
) n1
JOIN "transaction" nr ON n1.id = nr.id