UPDATEの代わりにMERGEステートメントを使用します。
下記の簡単な例をご覧ください。最初
テストデータ(table_2
でid
列がnull):
:
create table table_2 as
SELECT LEVEL as id, chr(64+level) as name
from dual connect by level <= 5;
create table table_1 as select * from table_2;
update table_2 set id = null;
commit;
SELECT * FROM table_1;
ID NAME
---------- ----
1 A
2 B
3 C
4 D
5 E
SELECT * FROM table_2;
ID NAME
---------- ----
A
B
C
D
E
これは、それらのrownumnsに基づか二番目の1つのテーブルからid
値を複写コマンドをMERGEあります
MERGE INTO table_2 t2
USING (
SELECT *
FROM (
select t.*, rownum as rn
from table_1 t
) t1
JOIN (
select rownum as rn, rowid as rid
from table_2 t
) t2
ON t1.rn = t2.rn
) d
ON (t2.rowid = d.rid)
WHEN MATCHED THEN UPDATE SET t2.id = d.id;
そして、マージ後の結果は次のとおりです。
SELECT * FROM table_2;
ID NAME
---------- ----
1 A
2 B
3 C
4 D
5 E
編集ご質問や、サンプルデータと望ましい結果を提供します。 'rownum'は擬似列であり、実際の列ではないので、あなたが考えるべきであると思われる振る舞いをしません。 –
なぜデータを関連付ける方法が他にありませんか?それはリレーショナルデータベースを採用する良い方法ではないようです... – SandPiper
私はSandPiperに同意します。リレーショナルデータベースの行は**ソートされていません**。 「ランダム」値に基づいて2つのテーブルを結合することは意味をなさない。 –