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 , mit der Tabelle 1 mit Tabelle 2 aktualisiert name
und desc
verwendet werden kann id
? Das Endergebnis, das ich bekommen würde, ist
Tabelle 1:
id name desc
-----------------------
1 x 123
2 y 345
3 c adf
Die Frage stammt aus der Aktualisierung einer Tabelle mit Daten aus einer anderen , jedoch speziell für Oracle SQL.
sql
oracle
sql-update
Muhd
quelle
quelle
Antworten:
Dies wird als korreliertes Update bezeichnet
Angenommen, die Verknüpfung führt zu einer schlüsselerhaltenen Ansicht
quelle
WHERE EXISTS
verhindert das, dass Sie eine Zeile in aktualisieren,t1
wenn keine übereinstimmende Zeile in vorhanden istt2
. Ohne diese Option wird jede Zeile int1
aktualisiert und die Werte werden auf gesetzt,NULL
wenn keine übereinstimmende Zeile in vorhanden istt2
. Das ist im Allgemeinen nicht das, was Sie wollen, also wird dasWHERE EXISTS
im Allgemeinen benötigt.SELECT ... FROM t2
Muss zu einer eindeutigen Zeile führen muss. Dies bedeutet, dass Sie für alle Felder, die einen eindeutigen Schlüssel enthalten, auswählen müssen - ein nicht eindeutiger Primärschlüssel reicht nicht aus. Ohne Eindeutigkeit werden Sie auf so etwas wie die @ PaulKarr-Schleife reduziert - und wenn es keine eindeutige Korrelation gibt, kann mehr als eine Zielzeile für jede Quellzeile aktualisiert werden.table2
) mehrere Zeilen für einen oder mehreretable1
Werte zurückgibt und Oracle nicht weiß, welche Sie verwenden möchten. Normalerweise bedeutet dies, dass Sie die Unterabfrage so verfeinern müssen, dass sie eine einzelne eindeutige Zeile zurückgibt.Versuche dies:
quelle
table1
undtable2
es sich um dieselbe Tabelle handelt. Achten Sie einfach auf den -partON
und dieWHERE
-klausel für dieSELECT
-Statement vontable2
!Versuchen
quelle
hat bei mir nie funktioniert, da set nur 1 Wert erwartet - SQL-Fehler: ORA-01427: Einzeilige Unterabfrage gibt mehr als eine Zeile zurück.
Hier ist die Lösung:
So genau führen Sie es im SQLDeveloper-Arbeitsblatt aus. Sie sagen, es ist langsam, aber das ist die einzige Lösung, die in diesem Fall für mich funktioniert hat.
quelle
Hier scheint eine noch bessere Antwort mit der 'in'-Klausel zu sein, die mehrere Schlüssel für den Join zulässt :
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. wo ( Spalte1, Spalte2 ) in ( wählen Sie ( Spalte1, Spalte2 ) aus der Tabelle, in der "die Menge, die ich will" );
quelle
404
)Wenn Ihre Tabelle t1 und ihre Sicherung t2 viele Spalten haben, können Sie dies auf kompakte Weise tun.
Außerdem bestand mein damit verbundenes Problem darin, dass nur einige der Spalten geändert wurden und viele Zeilen keine Änderungen an diesen Spalten aufwiesen. Daher wollte ich diese in Ruhe lassen - im Grunde genommen eine Teilmenge von Spalten aus einer Sicherung der gesamten Tabelle wiederherstellen. Wenn Sie nur alle Zeilen wiederherstellen möchten, überspringen Sie die where-Klausel.
Der einfachere Weg wäre natürlich, als Auswahl zu löschen und einzufügen, 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, die zweite Tabelle _1 erhält. Also hier ist, was ich mir ausgedacht habe:
quelle
quelle