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

How to update column in one table from other table without common key

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

Table1:

someid value
1      0
2      0
3      0

Table2:

someid value
9      1
10     2
11     3

我想用 Table2.value 值逐行更新 Table1.value,没有公共键,没有 where 子句只是 table1.value row1 = table2.value 行 1 等。就像水平联合。

所以表 1 应该是:

someid value
1      1
2      2
3      3

我试试:

update table1
set value = table2.value
from table2

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

1   1
2   1
3   1

您可以使用 row_number() window 解析函数尝试以下 sql 语句:

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

那些返回值来自table1

Demo

您可以使用 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