MERGE INTO
Gilt für: Databricks SQL Databricks Runtime
Führt eine Reihe von Aktualisierungen, Einfügungen und Löschungen anhand einer Quelltabelle in einer Delta-Zieltabelle zusammen.
Diese Anweisung wird nur für Delta Lake-Tabellen unterstützt.
Diese Seite enthält Details zur Verwendung der richtigen Syntax mit dem Befehl MERGE
. Weitere Anleitungen zur Verwendung von MERGE
-Vorgängen zum Verwalten Ihrer Daten finden Sie unter Ausführen eines Upsert-Vorgangs zum Platzieren von Daten in einer Delta Lake-Tabelle mithilfe von „merge“.
Syntax
MERGE [ WITH SCHEMA EVOLUTION ] INTO target_table_name [target_alias]
USING source_table_reference [source_alias]
ON merge_condition
{ WHEN MATCHED [ AND matched_condition ] THEN matched_action |
WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition ] THEN not_matched_action |
WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition ] THEN not_matched_by_source_action } [...]
matched_action
{ DELETE |
UPDATE SET * |
UPDATE SET { column = { expr | DEFAULT } } [, ...] }
not_matched_action
{ INSERT * |
INSERT (column1 [, ...] ) VALUES ( expr | DEFAULT ] [, ...] )
not_matched_by_source_action
{ DELETE |
UPDATE SET { column = { expr | DEFAULT } } [, ...] }
Parameter
WITH SCHEMA EVOLUTION
Gilt für: Databricks Runtime 15.2 und höher
Aktiviert automatischen Schemaentwicklung für diesen
MERGE
-Vorgang. Wenn diese Option aktiviert ist, wird das Schema der Delta-Zieltabelle automatisch an das Schema der Quelltabelle angepasst.-
Ein Tabellenname, der die Tabelle angibt, die geändert wird. Die Tabelle, auf die verwiesen wird, muss eine Delta-Tabelle sein.
Der Name darf keine Optionsspezifikation enthalten.
Die Tabelle darf keine Fremdtabelle sein.
-
Ein Tabellenalias für die Zieltabelle. Der Alias darf keine Spaltenliste enthalten.
-
Ein Tabellenname, der die Quelltabelle angibt, die mit der Zieltabelle zusammengeführt werden soll.
-
Ein Tabellenalias für die Quelltabelle. Der Alias darf keine Spaltenliste enthalten.
-
Gibt an, wie die Zeilen aus einer Beziehung mit den Zeilen einer anderen Beziehung kombiniert werden. Ein Ausdruck mit dem Rückgabetyp BOOLEAN.
WHEN MATCHED [ AND
matched_condition]
WHEN MATCHED
-Klauseln werden ausgeführt, wenn eine Quellzeile mit einer Zieltabellenzeile übereinstimmt, basierend auf demmerge_condition
und dem optionalenmatch_condition
.matched_action
DELETE
Löscht die übereinstimmende Zieltabellenzeile.
Mehrere Übereinstimmungen sind zulässig, wenn Übereinstimmungen bedingungslos gelöscht werden. Ein unbedingtes Löschen ist nicht mehrdeutig, auch wenn es mehrere Übereinstimmungen gibt.
UPDATE
Aktualisiert die übereinstimmende Zieltabellenzeile.
Verwenden Sie
UPDATE SET *
, um alle Spalten der Delta-Zieltabelle mit den entsprechenden Spalten des Quelldatasets zu aktualisieren. Dies ist gleichbedeutend mitUPDATE SET col1 = source.col1 [, col2 = source.col2 ...]
für alle Spalten der Delta-Zieltabelle. Deshalb wird bei dieser Aktion davon ausgegangen, dass die Quelltabelle dieselben Spalten wie die Zieltabelle enthält. Andernfalls löst die Abfrage einen Analysefehler aus.Hinweis
Dieses Verhalten ändert sich, wenn die automatische Schemaentwicklung aktiviert wird. Weitere Informationen finden Sie unter Automatische Schemaentwicklung für Delta Lake-Merge.
Gilt für: Databricks SQL Databricks Runtime 11.3 LTS und höher
Sie können
DEFAULT
alsexpr
festlegen, um die Spalte explizit auf ihren Standardwert zu aktualisieren.
Wenn es mehrere
WHEN MATCHED
-Klauseln gibt, werden sie in der Reihenfolge ausgewertet, in der sie angegeben wurden. JedeWHEN MATCHED
-Klausel, mit Ausnahme der letzten, muss einmatched_condition
haben. Andernfalls gibt die Abfrage einen Fehler des Typs NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION zurück.Wenn keine der
WHEN MATCHED
-Bedingungen für ein Quell- und Zielzeilenpaar, das mitmerge_condition
übereinstimmt, als wahr ausgewertet wird, bleibt die Zielzeile unverändert.WHEN NOT MATCHED [BY TARGET] [ AND
not_matched_condition]
WHEN NOT MATCHED
-Klauseln fügen eine Zeile ein, wenn eine Quellzeile basierend aufmerge_condition
und dem optionalennot_matched_condition
mit keiner Zielzeile übereinstimmt.Gilt für: Databricks SQL Databricks Runtime 12.2 LTS und höher
WHEN NOT MATCHED BY TARGET
kann als Alias fürWHEN NOT MATCHED
verwendet werden.not_matched_condition
muss ein boolescher Ausdruck sein.INSERT *
Fügt alle Spalten der Ziel-Delta-Tabelle mit den entsprechenden Spalten des Quelldatensatzes ein. Dies ist gleichbedeutend mit
INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...])
für alle Spalten der Delta-Zieltabelle. Diese Aktion erfordert, dass die Quelltabelle dieselben Spalten wie die Zieltabelle hat.Hinweis
Dieses Verhalten ändert sich, wenn die automatische Schemaentwicklung aktiviert wird. Weitere Informationen finden Sie unter Automatische Schemaentwicklung für Delta Lake-Merge.
INSERT ( ... ) VALUES ( ... )
Die neue Zeile wird basierend auf der angegebenen Spalte und den entsprechenden Ausdrücken generiert. Es müssen nicht alle Spalten der Zieltabelle angegeben werden. Für nicht angegebene Zielspalten wird der Spaltenstandard eingefügt oder
NULL
, wenn keiner vorhanden ist.Gilt für: Databricks SQL Databricks Runtime 11.3 LTS und höher
Sie können
DEFAULT
als Ausdruck angeben, um den Spaltenstandard für eine Zielspalte explizit einzufügen.
Wenn es mehrere
WHEN NOT MATCHED
-Klauseln gibt, werden sie in der Reihenfolge ausgewertet, in der sie angegeben wurden. Bei allenWHEN NOT MATCHED
-Klauseln, mit Ausnahme der letzten, muss esnot_matched_condition
geben. Andernfalls gibt die Abfrage einen Fehler des Typs NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION zurück.WHEN NOT MATCHED BY SOURCE [ AND
not_matched_by_source_condition]
Gilt für: Databricks SQL Databricks Runtime 12.2 LTS und höher
WHEN NOT MATCHED BY SOURCE
-Klauseln werden ausgeführt, wenn eine Zielzeile basierend aufmerge_condition
mit keiner Zeile in der Quelltabelle übereinstimmt undnot_match_by_source_condition
(optional) als true ausgewertet wird.not_matched_by_source_condition
muss ein boolescher Ausdruck sein, der nur auf Spalten aus der Zieltabelle verweist.not_matched_by_source_action
DELETE
Löscht die Zieltabellenzeile.
UPDATE
Aktualisiert die Zieltabellenzeile.
expr
kann nur auf Spalten aus der Zieltabelle verweisen, andernfalls löst die Abfrage einen Analysefehler aus.Gilt für: Databricks SQL Databricks Runtime 11.3 LTS und höher
Sie können
DEFAULT
alsexpr
festlegen, um die Spalte explizit auf ihren Standardwert zu aktualisieren.
Wichtig
Das Hinzufügen einer
WHEN NOT MATCHED BY SOURCE
-Klausel zum Aktualisieren oder Löschen von Zielzeilen, wennmerge_condition
als false ausgewertet wird, kann dazu führen, dass eine große Anzahl von Zielzeilen geändert wird. Um eine optimale Leistung zu erzielen, wenden Sienot_matched_by_source_condition
an, um die Anzahl der aktualisierten oder gelöschten Zielzeilen zu begrenzen.Wenn es mehrere
WHEN NOT MATCHED BY SOURCE clauses
gibt, werden sie in der Reihenfolge ausgewertet, in der sie angegeben wurden. JedeWHEN NOT MATCHED BY SOURCE
-Klausel, mit Ausnahme der letzten, muss einnot_matched_by_source_condition
haben. Andernfalls gibt die Abfrage einen Fehler des Typs NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION zurück.Wenn keine der
WHEN NOT MATCHED BY SOURCE
-Bedingungen für eine Zielzeile, die basierend aufmerge_condition
mit keiner Zeile in der Quelltabelle übereinstimmt, als true ausgewertet wird, bleibt die Zielzeile unverändert.
Wichtig
MERGE
Vorgänge schlagen mit einem DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE Fehler fehl, wenn mehr als eine Zeile in der Quelltabelle die gleiche Zeile in der Zieltabelle entspricht, basierend auf den in den ON
Und-Klauseln WHEN MATCHED
angegebenen Bedingungen. Gemäß der SQL-Semantik des Zusammenführens ist dieser Aktualisierungsvorgangstyp mehrdeutig, da unklar ist, welche Quellzeile verwendet werden soll, um die übereinstimmende Zielzeile zu aktualisieren. Sie können die Quelltabelle vorverarbeiten, um die Möglichkeit mehrerer Übereinstimmungen auszuschließen. Sehen Sie sich das Beispiel für die Änderungsdatenerfassung an. In diesem Beispiel wird das Änderungsdatenset (das Quelldatenset) vorverarbeitet, um nur die neueste Änderung für jeden Schlüssel beizubehalten, bevor diese Änderung in die Ziel-Delta-Tabelle angewendet wird. In Databricks Runtime 15.4 LTS und darunter werden nur Bedingungen in der ON
Klausel berücksichtigt, MERGE
bevor mehrere Übereinstimmungen ausgewertet werden.
Beispiele
Sie können MERGE INTO
für komplexe Vorgänge wie das Deduplizieren von Daten, das Upserting von Änderungsdaten, das Anwenden von SCD-Typ 2-Vorgängen usw. verwenden. Einige Beispiele finden Sie unter Upsert in eine Delta Lake-Tabelle mithilfe von Merge.
WHEN MATCHED
-- Delete all target rows that have a match in the source table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN MATCHED THEN DELETE
-- Conditionally update target rows that have a match in the source table using the source value.
> MERGE INTO target USING source
ON target.key = source.key
WHEN MATCHED AND target.updated_at < source.updated_at THEN UPDATE SET *
-- Multiple MATCHED clauses conditionally deleting matched target rows and updating two columns for all other matched rows.
> MERGE INTO target USING source
ON target.key = source.key
WHEN MATCHED AND target.marked_for_deletion THEN DELETE
WHEN MATCHED THEN UPDATE SET target.updated_at = source.updated_at, target.value = DEFAULT
WHEN NOT MATCHED [BY TARGET]
-- Insert all rows from the source that are not already in the target table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED THEN INSERT *
-- Conditionally insert new rows in the target table using unmatched rows from the source table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED BY TARGET AND source.created_at > now() - INTERVAL “1” DAY THEN INSERT (created_at, value) VALUES (source.created_at, DEFAULT)
WHEN NOT MATCHED BY SOURCE
-- Delete all target rows that have no matches in the source table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED BY SOURCE THEN DELETE
-- Multiple NOT MATCHED BY SOURCE clauses conditionally deleting unmatched target rows and updating two columns for all other matched rows.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED BY SOURCE AND target.marked_for_deletion THEN DELETE
WHEN NOT MATCHED BY SOURCE THEN UPDATE SET target.value = DEFAULT
WITH SCHEMA EVOLUTION
-- Multiple MATCHED and NOT MATCHED clauses with schema evolution enabled.
> MERGE WITH SCHEMA EVOLUTION INTO target USING source
ON source.key = target.key
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *
WHEN NOT MATCHED BY SOURCE THEN DELETE