Heim >Datenbank >MySQL-Tutorial >Wie vermeide ich Endlosschleifen bei der Verwendung korrelierter Unterabfragen für UPDATE-Anweisungen in Oracle?
Update mit Join-Abfrage in Oracle: Umgang mit korrelierten Updates
In Oracle kann das Ausführen einer Update-Abfrage mit einer korrelierten Unterabfrage zu unerwartetem Verhalten führen oder Fehler, wenn die Unterabfrage keine einzige Zeile zurückgibt. Betrachten Sie die folgende Abfrage:
UPDATE table1 t1 SET (t1.col, t1.Output) = ( SELECT t2.col, t3.Output + t2.col FROM tabl2 t3 LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key WHERE t2.col is not NULL);
Problem:
Die bereitgestellte Abfrage wird unbegrenzt ausgeführt, da die Unterabfrage möglicherweise mehrere Zeilen für jede Zeile in Tabelle1 zurückgibt. In diesem Szenario versucht Oracle, jede Zeile in Tabelle1 mehrmals zu aktualisieren, was zu einer Endlosschleife führt.
Lösung:
Um dieses Problem zu beheben, ist Folgendes erforderlich Stellen Sie sicher, dass die Unterabfrage für jede Zeile in Tabelle 1, die aktualisiert wird, eine einzelne Zeile zurückgibt. Ein Ansatz besteht darin, eine Bedingung hinzuzufügen, die Zeilen in Tabelle 1 mit Zeilen in der Unterabfrage verknüpft:
UPDATE table1 t1 SET (t1.col,t1.Output) = ( SELECT t2.col, t3.Output + t2.col FROM tabl2 t3 LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key WHERE t2.col is not NULL AND t1.some_key = t2.some_key);
In dieser modifizierten Abfrage stellt die zusätzliche Bedingung t1.some_key = t2.some_key sicher, dass nur übereinstimmende Zeilen vorhanden sind in der Unterabfrage enthalten, was zu einer einzelnen Zeile für jede Tabelle1-Zeile führt.
Außerdem lohnt es sich zu überlegen, ob die Abfrage beabsichtigt, alle zu aktualisieren Zeilen in Tabelle1 oder nur eine Teilmenge davon. Wenn das Ziel darin besteht, nur bestimmte Zeilen basierend auf den Ergebnissen der Unterabfrage zu aktualisieren, können der UPDATE-Klausel zusätzliche Filterkriterien hinzugefügt werden.
Das obige ist der detaillierte Inhalt vonWie vermeide ich Endlosschleifen bei der Verwendung korrelierter Unterabfragen für UPDATE-Anweisungen in Oracle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!