Heim >Datenbank >MySQL-Tutorial >Wie vermeide ich Endlosschleifen bei der Verwendung korrelierter Unterabfragen für UPDATE-Anweisungen in Oracle?

Wie vermeide ich Endlosschleifen bei der Verwendung korrelierter Unterabfragen für UPDATE-Anweisungen in Oracle?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-29 02:24:11579Durchsuche

How to Avoid Infinite Loops When Using Correlated Subqueries for UPDATE Statements 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn