Oracle SQL: Aktualisieren Sie eine Tabelle mit Daten aus einer anderen Tabelle


Answers

Versuche dies:

MERGE INTO table1 t1
USING
(
-- For more complicated queries you can use WITH clause here
SELECT * FROM table2
)t2
ON(t1.id = t2.id)
WHEN MATCHED THEN UPDATE SET
t1.name = t2.name,
t1.desc = t2.desc;
Question

Tabelle 1:

id    name    desc
-----------------------
1     a       abc
2     b       def
3     c       adf

Tabelle 2:

id    name    desc
-----------------------
1     x       123
2     y       345

Wie führe ich in Oracle SQL eine SQL-Aktualisierungsabfrage aus , die Tabelle 1 mit dem name und der desc von Tabelle 2 desc Verwendung derselben id aktualisieren kann? Also das Endergebnis, das ich bekommen würde, ist

Tabelle 1:

id    name    desc
-----------------------
1     x       123
2     y       345
3     c       adf

Die Frage bezieht sich auf die Aktualisierung einer Tabelle mit Daten aus einer anderen , speziell für Oracle SQL.




Hier scheint eine noch bessere Antwort mit der 'in' -Klausel zu sein, die mehrere Schlüssel für den Join zulässt:

update fp_active set STATE='E', 
   LAST_DATE_MAJ = sysdate where (client,code) in (select (client,code) from fp_detail
  where valid = 1) ...

Das vollständige Beispiel ist hier: http://forums.devshed.com/oracle-development-96/how-to-update-from-two-tables-195893.html

Das Rindfleisch besteht darin, die Spalten, die Sie als Schlüssel in Klammern verwenden möchten, in der where-Klausel vor 'in' zu haben und die select-Anweisung mit denselben Spaltennamen in Klammern zu haben. where ( column1, column2 ) in ( select ( column1, column2 ) aus der Tabelle wo "die Menge, die ich will" );




Wenn Ihre Tabelle t1 und ihr Backup t2 viele Spalten haben, ist hier eine kompakte Möglichkeit, dies zu tun.

Außerdem war mein Problem, dass nur einige der Spalten geändert wurden und viele Zeilen keine Änderungen an diesen Spalten hatten. Daher wollte ich diese in Ruhe lassen - im Grunde eine Teilmenge von Spalten aus einer Sicherung der gesamten Tabelle wiederherstellen. Wenn Sie nur alle Zeilen wiederherstellen möchten, überspringen Sie die WHERE-Klausel.

Natürlich wäre der einfachste Weg das Löschen und Einfügen als Auswahl, aber in meinem Fall brauchte ich eine Lösung mit nur Updates.

Der Trick ist, dass, wenn Sie * aus einem Tabellenpaar mit doppelten Spaltennamen auswählen, der zweite Name _1 erhalten wird. Also hier ist, was ich herausgefunden habe:

  update (
    select * from t1 join t2 on t2.id = t1.id
    where id in (
      select id from (
        select id, col1, col2, ... from t2
        minus select id, col1, col2, ... from t1
      )
    )
  ) set col1=col1_1, col2=col2_1, ...