Oracle nicht das haben UPDATE ... FROM Syntax, die Sie von MS Sql Server verwenden (was, glaube ich, ist nicht ANSI sowieso). Stattdessen, wenn Sie ein Update auf einer Ergebnismenge tun müssen, um, Oracle hat man das Suchresultates als eine Art Inline-Ansicht erstellen, aktualisieren Sie über die Sicht, etwa so:
UPDATE (SELECT tp.delta_balance
, tp.post_balance
, ts.balance_due
FROM table_paid tp
JOIN table_snapshot ts
ON tp.account_no = ts.account_no
)
SET delta_balance = post_balance - balance_due;
Dies ist mehr „richtiger“ als die von Babar und palindrom gelieferten Antworten, da ihre Abfragen jede Zeile in table_paid aktualisieren, auch wenn in table_snapshot keine entsprechenden Zeilen vorhanden sind. Wenn es eine Übereinstimmung von 1-1 gibt, müssen Sie sich keine Sorgen machen, aber es ist sicherer, dies mit der Inline-Ansicht zu tun.
In Ihrem Beispiel ist unklar, welche Tabelle die Elterntabelle ist, oder (wie ich vermute) die Elterntabelle und account_no verweist auf den Primärschlüssel einer anderen Tabelle (vermutlich account oder "table_account" von Ihrem Regeln der Namensgebung). In jedem Fall ist klar, dass es in Ihrer Tabelle keine 1: 1 Übereinstimmung gibt - 15K in einer, Millionen in der anderen.
Dies könnte 2 Dinge bedeuten: entweder gibt es viele Zeilen in table_snapshot, die keine entsprechende Zeile in table_paid haben, oder es gibt viele Zeilen in table_snapshot für jede Zeile in table_paid. Wenn Letzteres wahr ist, ist Ihre Abfrage unmöglich - Sie haben mehrere Aktualisierungen für jede Zeile in table_paid, und das Ergebnis wird nicht vorhersehbar sein; Woher weißt du, welche der Ausdrücke "post_balance - balance_due" letztendlich den Wert einer gegebenen delta_balance bestimmen?
Wenn Sie meine Abfrage ausführen, werden Sie dies schnell genug herausfinden - Sie erhalten eine Fehlermeldung, die besagt, "ORA-01779: kann keine Spalte ändern, die auf eine nicht Schlüssel-beibehaltene Tabelle". Dieser Fehler wird nicht basierend auf den Daten in der Tabelle angezeigt (möglicherweise in Ordnung), sondern basiert auf den Primärschlüsseln, die Sie in den beiden Tabellen definiert haben.Wenn die Join-Bedingung, die Sie angeben, nicht eindeutig zu einer 1-1-Beziehung zwischen der aktualisierten Tabelle und dem Rest des Joins führt, erhalten Sie diesen Fehler basierend auf den definierten Schlüsseln. Es ist Oracles Art, Ihnen zu sagen: "Sie sind dabei, Ihre Daten zu vermasseln".
In den anderen Antworten hier erhalten Sie nur einen Fehler (in diesem Fall ORA-01427: einreihige Unterabfrage gibt mehr als eine Zeile zurück), wenn Sie tatsächlich Daten haben, die ein Problem verursachen würden; Meine Version ist strenger, es kann also sein, dass Sie die anderen Versionen verwenden müssen.
Und wie die anderen schon gesagt haben, werden Sie definitiv einen Index für account_no für die Tabelle table_snapshot haben wollen. Einer auf dem table_paid würde auch nicht weh tun.
Ausgezeichnet .. Danke für die detaillierte Info! – novice