使用表y中的insert id更新所有表x行

时间:2017-04-19 01:13:31

标签: postgresql

我的表格x包含许多现有行

x ( id, name)

我有一个新表y,当前为空,(所有字段都有默认值)

y ( id, uuid )

我用新列y_id

更新了x

x ( id, name, y_id )

我想为x中的每一行填充y,然后通过y.id

将x与y相关联

这和我的一样接近,但这会将x的所有行设置为具有相同的y.id。

with ys as (
  insert into y(uuid) values(default)
  returning id
)
update x set y_id = ys.id
from ys

1 个答案:

答案 0 :(得分:2)

您希望为“x”的每个值填充“y”。但是你没有办法连接表格。但是。 。

with ys as (
  insert into y
      select   -- this is empty on purpose to put in only default values
      from x;
  returning id
)
update x
    set y_id = yy.id
    from (select x.*, row_number() over (order by x_id) as seqnum
          from x
         ) xx join
         (select ys.*, row_number() over (order by y_id) as seqnum
          from ys
         ) yy
         on xx.seqnum = yy.seqnum
where x.x_id = xx.x_id;

这是做什么的? CTE在y中插入一行,其中x中的每一行都有默认值。 insert然后将序列号添加到x和y,以便它们可以对齐,一行到一行。然后将该值用于更新。