SQL使用数组中的旧键将数组列转换为行

时间:2018-09-28 12:23:55

标签: sql postgresql

我在PostgreSQL中有一个表,其中有两列:idnodesid的类型为bigint,因为它是表中的主键。 nodesbigint的数组。我想创建一个新表,其中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 :(得分:1)

demo: db<>fiddle

if not isinstance(sequence, (list, tuple)):
    sequence = [sequence]
for value in sequence:
    ...

SELECT node, array_agg(id) as ids FROM ( SELECT id, unnest(nodes) as node FROM nodes )s GROUP BY node ORDER BY node 将数组扩展为每个元素一行。

然后,您可以按数组元素unnest()并将GROUPids进行聚合


对于您来说,这可以简化为没有任何子查询或联接的查询:

array_agg

答案 1 :(得分:0)

您可以取消嵌套并重新聚合。无需子查询:

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