2017-04-14 3 views
0

Ich brauche Oracle SQL schreiben Spalte mit dem Wert von nicht verwandten Tabelle zu aktualisieren rownum verwenden.Oracle Update basiert auf rownum

Ich kann sie nicht arbeiten:

UPDATE table_1 A 
SET A.id = (SELECT B.id FROM table_2 B 
     WHERE A.rownum = B.rownum) 

Dank.

brauchen nur Wert aus Spalte ID auf eine andere Tabelle einzufügen. Es gibt keine Spalten, die ich für Join aber rownum verwenden kann. Ist das möglich?

+3

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. –

+1

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

+0

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. –

Antwort

1

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 
+0

Vielen Dank. Es klappt. – Steve

Verwandte Themen