0

一時テーブルのコードで更新する必要がある列があります。一時テーブルには +/- 5 個のコードがあります。テーブルの各行は、一時テーブルのいずれかの値で更新する必要があります。

Example
id  code
1   200
2   400
3   600
4   9000
5   800
6   200
7   400
8   600
9   9000
10  800
4

3 に答える 3

1

行セットを取得するには、これを試す必要があります

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

http://sqlfiddle.com/#!3/cbd84/1

于 2012-10-25T12:22:15.340 に答える
0

SQLServerソリューション

このクエリは、テーブルから値を順番に取得し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

row_number()IDがどちらのテーブルでも連続していない場合は、最初にIDを指定できます。

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でも使用できますが、構文は少し異なります。

于 2012-10-25T12:16:47.350 に答える
0

別のアプローチ: 更新するテーブルの名前が Example であるとします。単純な Oracle Merge です。

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
于 2012-10-25T12:25:57.000 に答える