Verwenden MERGE-Anweisung statt UPDATE.
Bitte ein einfaches Beispiel finden Sie unten.
Testdaten zuerst (id
Spalte in table_2
ist 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
Dies ist Befehl MERGE, die id
Werte von einem Tisch zum zweiten auf ihre rownumns stützen Kopierer:
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;
und ein Ergebnis nach merge ist:
SELECT * FROM table_2;
ID NAME
---------- ----
1 A
2 B
3 C
4 D
5 E
Bearbeiten Sie Ihre Frage und Beispieldaten und die gewünschten Ergebnisse liefern. 'rownum' ist eine Pseudo-Spalte, keine echte Spalte, also verhält es sich nicht so, wie Sie es für richtig halten. –
Warum haben Sie keine andere Möglichkeit, die Daten in Beziehung zu setzen? Das scheint keine gute Möglichkeit zu sein, eine relationale Datenbank zu verwenden ... – SandPiper
Ich stimme SandPiper zu. Zeilen in einer relationalen Datenbank werden ** nicht ** sortiert. Das Verbinden von zwei Tabellen basierend auf einem "zufälligen" Wert macht keinen Sinn. –