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 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
-
Ein Tabellenname, der die Tabelle angibt, die geändert wird. Die Tabelle, auf die verwiesen wird, muss eine Delta-Tabelle sein.
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 Schemamigration aktiviert wird. Weitere Informationen finden Sie unter Automatische Schemaentwicklung für Delta Lake-Merge.
Gilt für: Databricks SQL SQL-Warehouse Version 2022.35 oder höher Databricks Runtime 11.2 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.1 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 Schemamigration 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 SQL-Warehouse Version 2022.35 oder höher Databricks Runtime 11.2 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.1 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 SQL-Warehouse Version 2022.35 oder höher Databricks Runtime 11.2 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
Ein MERGE
-Vorgang kann mit einem Fehler des Typs DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE fehlschlagen, wenn mehrere Zeilen des Quelldatasets übereinstimmen und versucht wird, dieselben Zeilen der Delta-Zieltabelle zu aktualisieren. Entsprechend der SQL-Semantik von MERGE ist ein solcher UPDATE-Vorgang mehrdeutig, da unklar ist, welche Quellzeile zum Aktualisieren der übereinstimmenden Zielzeile verwendet werden soll. Sie können die Quelltabelle vorverarbeiten, um die Möglichkeit mehrerer Übereinstimmungen auszuschließen. Sehen Sie sich das Beispiel zu Change Data Capture an. Es zeigt, wie Sie das Änderungsdataset (d. h. das Quelldataset) vorverarbeiten können, um nur die neueste Änderung für jeden Schlüssel beizubehalten, bevor diese Änderung auf die Delta-Zieltabelle angewendet wird.
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