Fehlerbehebung bei einer unbestimmten Update-Abfrage mit Join in Oracle
Beim Ausführen der folgenden UPDATE-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);
Benutzer Es kann zu einem unbestimmten Ausführungsfehler kommen. Dieser Artikel geht auf das Problem ein und bietet eine Lösung.
Das Problem: Nicht eindeutige Unterabfrageergebnisse
Die Hauptursache des Fehlers liegt in der Unterabfrage innerhalb des UPDATE Stellungnahme. Sofern die Unterabfrage nicht für jede Zeile in Tabelle 1 eine einzelne Zeile zurückgibt, schlägt der Aktualisierungsvorgang fehl. Der LEFT JOIN in der Unterabfrage ermöglicht mehrere übereinstimmende Zeilen, was möglicherweise zu einer nicht deterministischen Aktualisierung führt.
Lösung: Sicherstellen, dass die Unterabfrage eine einzelne Zeile zurückgibt
Um das zu beheben Bei diesem Problem ist eine Bedingung erforderlich, um Zeilen in Tabelle 1 mit Zeilen in der Unterabfrage in Beziehung zu setzen und so sicherzustellen, dass die Unterabfrage eine einzelne Zeile zurückgibt. Dies kann durch Hinzufügen einer Join-Bedingung erreicht werden, die Zeilen anhand eines eindeutigen Schlüssels abgleicht:
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);
Adressierungsumfang des Updates
Eine weitere Überlegung ist die Tatsache, dass die Die UPDATE-Anweisung kann sich auf alle Zeilen in Tabelle 1 auswirken. Es ist wichtig zu beurteilen, ob dies das beabsichtigte Verhalten ist oder ob eine selektivere Aktualisierung erforderlich ist. Durch die Aufnahme zusätzlicher WHERE-Bedingungen in die UPDATE-Anweisung können Benutzer den Umfang der Aktualisierung nach Bedarf auf bestimmte Zeilen beschränken.
Das obige ist der detaillierte Inhalt vonWarum bleibt meine Oracle UPDATE-Abfrage mit einem JOIN hängen und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!