如何在没有公用键的情况下从另一个表更新一个表中的列

时间:2019-07-16 16:12:54

标签: sql postgresql sql-update

这可能是非常基本的,但是我不知道要搜索什么。

Table1:

someid value
1      0
2      0
3      0

Table2:

someid value
9      1
10     2
11     3

我想用Table1.value的值逐行更新Table2.value,没有公钥,没有table1.value row1 = table2.value row1等的where子句,等等。像水平联合一样。

所以表1应该是:

someid value
1      1
2      2
3      3

我尝试:

update table1
set value = table2.value
from table2

但是所有值都来自表2的第一行:

1   1
2   1
3   1

2 个答案:

答案 0 :(得分:1)

您可以使用with t as ( select row_number() over (order by someid) as someid, value from table2 ) update table1 t1 set value = t.value from t where t1.someid = t.someid returning t.*; someid value 1 1 2 2 3 2 窗口分析功能尝试以下sql语句:

table1

这些返回值来自{{1}}

Demo

答案 1 :(得分:1)

您可以使用row_number()

update table1 
set value = t2.value
from (
  select id, value, row_number() OVER (ORDER BY id) AS n from table1
) t inner join (
  select id, value, row_number() OVER (ORDER BY id) AS n from table2
) t2 on t.n = t2.n
where t.id = table1.id

请参见demo
表1的结果:

> id | value
> -: | ----:
>  1 |     1
>  2 |     2
>  3 |     3

如果您确定table1中的id是连续的且没有间隔并且从1开始,则可以这样简化查询:

update table1 
set value = t2.value
from (
  select id, value, row_number() OVER (ORDER BY id) AS n from table2
) t2 
where t2.n = table1.id

请参见demo