如何在没有公共键的情况下从另一个 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
您可以使用 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。
这可能是非常基本的,但我不知道要搜索什么。
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
您可以使用 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。