Запрос Postgres, чтобы получить все идентификаторы детей - PullRequest
0 голосов
/ 31 мая 2018

Я новичок в SQL и до сих пор писал только самые простые запросы.

У меня есть таблица, которая выглядит следующим образом

item_full_name      varchar(65535)
item_id             bigint
item_owners         varchar(255)
item_approver_group varchar(255)
item_state          varchar(255)
item_parent_id      bigint
item_children       varchar(65535)

Изначально item_children пуст для всех строк, нокаждый элемент имеет item_parent_id и не является нулевым.Я хочу написать запрос, который просматривает все строки и соответствующие родительские идентификаторы и обновляет item_children каждой строки с помощью строки дочерних идентификаторов, разделенных запятой.

, например,

item_full_name | item_id | item_owners | item_parent_id | item_children
item1          | 1       | o1, o2      | 2              | 
item2          | 3       | owner8      | 2              |
item3          | 2       | owner6      | 0              |
item4          | 4       | owner7      | 1              |

Thisдолжно быть преобразовано в

item_full_name | item_id | item_owners | item_parent_id | item_children
item1          | 1       | o1, o2      | 2              | 4
item2          | 3       | owner8      | 2              |
item3          | 2       | owner6      | 0              | 3,1
item4          | 4       | owner7      | 1              |

Любые указатели были бы полезны.Спасибо!

1 Ответ

0 голосов
/ 31 мая 2018

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

WITH cte AS (
    SELECT item_parent_id, STRING_AGG(item_id::text, ',') AS item_children
    FROM yourTable
    GROUP BY item_parent_id
)

SELECT
    t1.item_full_name,
    t1.item_id,
    t1.item_owners,
    t1.item_parent_id,
    t2.item_children
FROM yourTable t1
LEFT JOIN cte t2
    ON t1.item_id = t2.item_parent_id
ORDER BY
    t1.item_full_name;

enter image description here

Demo

...