2017-04-19 17 views
1

我有表X與許多現有的行更新所有的表x行與插入的ID從數據表Y

x (id, name)

我有一個新的數據表Y,這是目前空,(全字段有默認值)

y (id, uuid)

我X了新列更新y_id

x (id, name, y_id)

我想填充Ÿ在X中的每一行,然後通過關聯y.id x其中Ÿ

這是接近我有,但這套X的所有行有同樣的y.id.

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

回答

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添加一個序列號,以便它們可以對齊,從一行到一行。該值然後用於更新。

+1

該死!是的,這工作,令人印象深刻!我需要閱讀'over'我還沒有使用過。 – Tim

相關問題