SQL преобразовывает столбец массива в строки со старыми ключами в массивах - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть таблица в PostgreSQL, с двумя столбцами: id и nodes.id имеет тип bigint, так как это первичный ключ в таблице.nodes - это массив bigint.Я хотел бы создать новую таблицу, в которой узлы в массивах node являются ключами, а единственный другой столбец - это массив ids, который соответствует этому node.

Так скажемисходная таблица выглядит следующим образом:

id | nodes
1  | {200, 300, 400}
2  | {200, 300, 400}

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

node | ids
200  | {1, 2}
300  | {1, 2}
400  | {1, 2}

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вы можете удалить и заново собрать.Никаких подзапросов не требуется:

with t as (
      select 1 as id, array[200, 300, 400] as nodes union all
      select 2 as id, array[200, 300, 400] as nodes 
     )
select node, array_agg(t.id)
from t cross join
     unnest(nodes) node
group by node
0 голосов
/ 28 сентября 2018

demo: db <> fiddle

SELECT node, array_agg(id) as ids
FROM (
    SELECT id, unnest(nodes) as node 
    FROM nodes
)s 
GROUP BY node
ORDER BY node

unnest() расширяет массив в одну строку на элемент.

Тогда вы можете GROUPпо элементам массива и агрегируйте ids с array_agg


В вашем случае это можно сократить до запроса без какого-либо подзапроса или объединения:

SELECT unnest(nodes) as node, array_agg(id) as ids 
FROM nodes
GROUP BY node
ORDER BY node 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...