Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Könnte jemand erklären, was die MERGE-Anweisung in Oracle wirklich bewirkt?

Welche Art von Join wird durchgeführt? Ich glaube, es ist ein Full Outer Join, oder?

Nein, es ist ein normaler äußerer Join. Die Abfrage muss wissen, wann es Zeilen in der Zieltabelle gibt, die sich auch in der Quelltabelle befinden, und wann Datensätze in der Quelltabelle vorhanden sind, die nicht in der Zieltabelle enthalten sind. Da die Abfrage nicht auf Zeilen antworten muss, die sich in der Zieltabelle, aber nicht in der Quelltabelle befinden, braucht sie den äußeren Join nicht, um in beide Richtungen zu gehen.

Der äußere Join wird jedoch nicht ausgeführt, wenn kein not matched vorhanden ist Klausel (die vollkommen gültig ist). Der Optimierer ist schlau genug, um zu wissen, dass in diesem Fall ein Inner Join ausreicht.

bezüglich des WHEN MATCHED-Teils:was passiert, wenn eine Zeile von t mit mehreren Zeilen von s übereinstimmt?

Wenn es mehrere Übereinstimmungen gibt, wird die Aktualisierung für jede Übereinstimmung durchgeführt. Das bedeutet, dass das zuletzt kommende Update dasjenige ist, das in den Commit geschrieben wird. Es gibt keine Möglichkeit, eine Reihenfolge vorzugeben, also ist die Quelle des Updates in diesem Fall praktisch zufällig (aus der Menge der Übereinstimmungen).

Wie @ Vincent Malgrat betonte, war dies falsch. Es scheint, dass Oracle den Fehler „ORA-40926:Unfähig, einen stabilen Satz von Zeilen in der Quelltabelle zu erhalten“ erzeugt, wenn mehrere Übereinstimmungen vorhanden sind.

bezüglich des WHEN NOT MATCHED-Teils Ich glaube, es bedeutet „wenn eine Zeile in s keine Entsprechung in t hat“. Habe ich Recht?

Das ist richtig.