Вставка значений в массив в PostgreSQL

Вопрос:

Я пытаюсь вставить значения в целочисленный массив, используемый как путь для отображения всех предков определенного узла.

Эти значения (parent_link integer) относятся к таблице с идентификатором и parent_link. Я пытаюсь пересечь древовидную структуру, чтобы собрать все parent_link в пути для вставки в целочисленный массив, принадлежащий этому конкретному идентификатору. Я пытаюсь сделать это для каждой отдельной записи в моей базе данных. Пока у меня есть:

INSERT INTO master_ifis_network (path)
SELECT t2.parent_link
FROM master_ifis_network as t2
WHERE t2.parent_link = (SELECT t1.parent_link
FROM master_ifis_network as t1)
AND t2.link_id = (parent_link)

Я получаю сообщение о том, что я не могу вставить integer где ожидается integer[].
Я также пробовал это, который выводит список родительских узлов:

SELECT parentX.parent_link FROM [table name] as nodeX, [table name] as parentx
WHERE nodeX.left BETWEEN parentX.left AND parentX.right)
AND nodeX.link_id = [some id]
ORDER BY parentX.left DESC

Любые намеки или идеи?

Ответ №1

Используйте рекурсивный CTE, то есть: WITH RECURSIVE.
И вам нужно UPDATE, а не INSERT:

WITH RECURSIVE cte AS (
SELECT link_id, ARRAY[parent_link] AS path, 1 AS level
FROM   master_ifis_network

UNION  ALL
SELECT c.link_id, m.parent_link || c.path, c.level + 1
FROM   cte c
JOIN   master_ifis_network m ON m.link_id = c.path[1]
)
UPDATE master_ifis_network m
SET    path = sub.path
FROM  (
SELECT DISTINCT ON (link_id) *
FROM   cte
ORDER  BY link_id, level DESC
) sub
WHERE m.link_id = sub.link_id;

Похожие ответы:

Здесь много других. Поиск с помощью ключевых слов.

Ответ №2

Вот что я закончил:

UPDATE master_ifis_network SET path = array(SELECT parentX.parent_link
FROM master_ifis_network AS parentX
WHERE (nodeX.left BETWEEN parentX.left AND parentX.right) AND nodeX.link_id = [some id]
ORDER BY parentX.left DESC)
WHERE link_id = [same id];"

Оцените статью
TechArks.Ru
Добавить комментарий