我有一列需要使用临时表中的代码进行更新。临时表中有 +/- 5 个代码。表中的每一行都必须使用临时表中的值之一进行更新。
Example
id code
1 200
2 400
3 600
4 9000
5 800
6 200
7 400
8 600
9 9000
10 800
我有一列需要使用临时表中的代码进行更新。临时表中有 +/- 5 个代码。表中的每一行都必须使用临时表中的值之一进行更新。
Example
id code
1 200
2 400
3 600
4 9000
5 800
6 200
7 400
8 600
9 9000
10 800
要获取行集,您需要试试这个
declare @cnt int
select @cnt = count(*) from codes
select M.id, C.Code
from
(
select
T.id, (row_number() over (order by id) - 1) % @cnt + 1 as RowNum
from T as T
) as M
left outer join
(select Code, row_number() over (order by Code) as RowNum from codes as T) as C
on C.RowNum = M.RowNum
此查询将按顺序从temp
表中获取值,并以循环方式更新示例表中的代码,并temp
在需要时重复这些值。
update e
set code = t.code
from example e
join temp t on t.id = (e.id -1) % (select count(*) from temp) + 1
如果两个表中的 id 不是连续的,那么您可以row_number()
先使用它们,例如
update e
set code = t.code
from (select *,rn=row_number() over (order by id) from example) e
join (select *,rn=row_number() over (order by id) from temp) t
on t.rn = (e.rn -1) % (select count(*) from temp) + 1
相同的技术(mod,row-number)可以在其他 RDBMS 中使用,但语法会有所不同。
另一种方法:假设您要更新的表称为示例。一个简单的 Oracle 合并将是。
Merge INTO Example Using Temp_Table ON Example.Id = Temp_Table.Id
When Matched Then
UPDATE Example
SET Example.code = Temp_Table.code
From Example
Inner Join
Temp_Table
ON
Example.Id = Temp_Table.Id
When Not Matched Then
Insert Into Example
Select * From Temp_Table