Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 -Vorgängen zum Verwalten Ihrer Daten finden Sie unter MERGE.
Syntax
[ common_table_expression ]
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 * [ EXCEPT ( column [, ...] ) ] |
UPDATE SET { column = { expr | DEFAULT } } [, ...] }
not_matched_action
{ INSERT * [ EXCEPT ( column [, ...] ) ] |
INSERT (column1 [, ...] ) VALUES ( expr | DEFAULT ] [, ...] )
not_matched_by_source_action
{ DELETE |
UPDATE SET { column = { expr | DEFAULT } } [, ...] }
Parameter
-
Allgemeine Tabellenausdrücke (CTE) sind eine oder mehrere benannte Abfragen, die mehrmals innerhalb des Hauptabfrageblocks wiederverwendet werden können, um wiederholte Berechnungen zu vermeiden oder die Lesbarkeit komplexer geschachtelter Abfragen zu verbessern.
WITH SCHEMA EVOLUTIONGilt für:
Databricks Runtime 15.2 oder höherAktiviert 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 Sie verweisen, 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 einem Rückgabetyp vom Typ Boolean.
WHEN MATCHED [ ANDübereinstimmende_Bedingung]WHEN MATCHED-Klauseln werden ausgeführt, wenn eine Quellzeile mit einer Zieltabellenzeile übereinstimmt, basierend auf demmerge_conditionund dem optionalenmatch_condition.gepaarte_Aktion
DELETELöscht die übereinstimmende Zieltabellenzeile.
Databricks ermöglicht mehrere Übereinstimmungen, wenn Übereinstimmungen bedingungslos gelöscht werden. Ein unbedingtes Löschen ist nicht mehrdeutig, auch wenn es mehrere Übereinstimmungen gibt.
UPDATEAktualisiert 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. Daher wird bei dieser Aktion davon ausgegangen, dass die Quelltabelle die gleichen Spalten wie die in der Zieltabelle hat. andernfalls löst die Abfrage einen Analysefehler aus.Gilt für:
Databricks SQL
Databricks Runtime 12.2 LTS oder höherUm bestimmte Spalten auszuschließen
UPDATE SET *, verwenden Sie dieEXCEPTKlausel. Ausgeschlossene Zielspalten werden aufnull. Wenn die Schemaentwicklung aktiviert ist, beziehen sich dieEXCEPTSpalten auf Quellspalten und werden von der Schemaentwicklung ausgeschlossen. Weitere Informationen finden Sie unter "Spalten ausschließen" mit Zusammenführung .Hinweis
Dieses Verhalten ändert sich, wenn die automatische Schemaentwicklung aktiviert wird. Details finden Sie unter Automatische Schemaentwicklung für Zusammenführung.
Gilt für:
Databricks SQL
Databricks Runtime 11.3 LTS or aboveSie können
DEFAULTalsexprfestlegen, 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_conditionhaben. 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] [ ANDnicht_übereinstimmende_Bedingung]WHEN NOT MATCHED-Klauseln fügen eine Zeile ein, wenn eine Quellzeile basierend aufmerge_conditionund dem optionalennot_matched_conditionmit keiner Zielzeile übereinstimmt.Gilt für:
Databricks SQL
Databricks Runtime 12.2 LTS oder höherWHEN NOT MATCHED BY TARGETkann als Alias fürWHEN NOT MATCHEDverwendet werden.not_matched_conditionmuss 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.Gilt für:
Databricks SQL
Databricks Runtime 12.2 LTS oder höherUm bestimmte Spalten auszuschließen
INSERT *, verwenden Sie dieEXCEPTKlausel. Ausgeschlossene Zielspalten werden aufnull. Wenn die Schemaentwicklung aktiviert ist, beziehen sich dieEXCEPTSpalten auf Quellspalten und werden von der Schemaentwicklung ausgeschlossen. Weitere Informationen finden Sie unter "Spalten ausschließen" mit Zusammenführung .Hinweis
Dieses Verhalten ändert sich, wenn die automatische Schemaentwicklung aktiviert wird. Details finden Sie unter Automatische Schemaentwicklung für Zusammenführung.
INSERT ( ... ) VALUES ( ... )Databricks generiert die neue Zeile basierend auf der angegebenen Spalte und den entsprechenden Ausdrücken. Sie müssen nicht alle Spalten in der Zieltabelle angeben. 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 or aboveSie können
DEFAULTals 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_conditiongeben. Andernfalls gibt die Abfrage einen Fehler des Typs NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION zurück.WHEN NOT MATCHED BY SOURCE [ ANDnicht_von_der_Quellbedingung_übereinstimmend]Gilt für:
Databricks SQL
Databricks Runtime 12.2 LTS oder höherWHEN NOT MATCHED BY SOURCE-Klauseln werden ausgeführt, wenn eine Zielzeile basierend aufmerge_conditionmit keiner Zeile in der Quelltabelle übereinstimmt undnot_match_by_source_condition(optional) als true ausgewertet wird.not_matched_by_source_conditionmuss ein boolescher Ausdruck sein, der nur auf Spalten aus der Zieltabelle verweist.not_matched_by_source_action
DELETELöscht die Zieltabellenzeile.
UPDATEAktualisiert die Zieltabellenzeile.
exprkann 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 or aboveSie können
DEFAULTalsexprfestlegen, 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_conditionals 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_conditionan, um die Anzahl der aktualisierten oder gelöschten Zielzeilen zu begrenzen.Wenn es mehrere
WHEN NOT MATCHED BY SOURCE clausesgibt, 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_conditionhaben. 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 SOURCEBedingungen für eine Zielzeile als wahr gilt, die keiner Zeile in der Quelltabelle basierend aufmerge_conditionentspricht, 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 MERGE Klausel berücksichtigt, ON 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)
-- Insert all columns from the source except `last_updated`, which is set to null in the target.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED THEN INSERT * EXCEPT (last_updated)
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