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

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 update-Abfrage aus, die Tabelle 1 mit "Name" und "Description" von Tabelle 2 unter Verwendung derselben "ID" aktualisiert? Das Endergebnis würde also lauten

Tabelle 1:

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

Die Frage stammt von https://stackoverflow.com/questions/5036918/sql-update-query-with-data-from-another-table, aber speziell für Oracle SQL.

Lösung

Dies wird als korrelierte Aktualisierung bezeichnet.

UPDATE table1 t1
   SET (name, desc) = (SELECT t2.name, t2.desc
                         FROM table2 t2
                        WHERE t1.id = t2.id)
 WHERE EXISTS (
    SELECT 1
      FROM table2 t2
     WHERE t1.id = t2.id )

Unter der Annahme, dass die Verknüpfung zu einer schlüsselgesicherten Ansicht führt, könnten Sie auch

UPDATE (SELECT t1.id, 
               t1.name name1,
               t1.desc desc1,
               t2.name name2,
               t2.desc desc2
          FROM table1 t1,
               table2 t2
         WHERE t1.id = t2.id)
   SET name1 = name2,
       desc1 = desc2
Kommentare (9)

Versuchen Sie

UPDATE Table1 T1 SET
T1.name = (SELECT T2.name FROM Table2 T2 WHERE T2.id = T1.id),
T1.desc = (SELECT T2.desc FROM Table2 T2 WHERE T2.id = T1.id)
WHERE T1.id IN (SELECT T2.id FROM Table2 T2 WHERE T2.id = T1.id);
Kommentare (1)

Hier scheint eine noch bessere Antwort mit 'in' Klausel zu sein, die mehrere Schlüssel für die Verbindung ermöglicht:

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 finden Sie hier: http://forums.devshed.com/oracle-development-96/how-to-update-from-two-tables-195893.html

Das Problem besteht darin, dass Sie die Spalten, die Sie als Schlüssel verwenden wollen, in der where-Klausel vor 'in' in Klammern setzen und die select-Anweisung mit denselben Spaltennamen in Klammern setzen. where (Spalte1,Spalte2) in ( select (Spalte1,Spalte2) from table where "die gewünschte Menge" );

Kommentare (0)