MERGE INTO

Gilt für:check marked yes Databricks SQL check marked yes 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

  • target_table_name

    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.

  • target_alias

    Ein Tabellenalias für die Zieltabelle. Der Alias darf keine Spaltenliste enthalten.

  • source_table_reference

    Ein Tabellenname, der die Quelltabelle angibt, die mit der Zieltabelle zusammengeführt werden soll.

  • source_alias

    Ein Tabellenalias für die Quelltabelle. Der Alias darf keine Spaltenliste enthalten.

  • ON merge_condition

    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 dem merge_condition und dem optionalen match_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 mit UPDATE 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:check marked yes Databricks SQL SQL-Warehouse Version 2022.35 oder höher check marked yes Databricks Runtime 11.2 und höher

      Sie können DEFAULT als expr 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. Jede WHEN MATCHED-Klausel, mit Ausnahme der letzten, muss ein matched_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 mit merge_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 auf merge_condition und dem optionalen not_matched_condition mit keiner Zielzeile übereinstimmt.

    Gilt für:check marked yesDatabricks SQL check marked yes Databricks Runtime 12.1 und höher

    WHEN NOT MATCHED BY TARGET kann als Alias für WHEN 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:check marked yes Databricks SQL SQL-Warehouse Version 2022.35 oder höher check marked yes 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 allen WHEN NOT MATCHED-Klauseln, mit Ausnahme der letzten, muss es not_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:check marked yesDatabricks SQL check marked yes Databricks Runtime 12.1 und höher

    WHEN NOT MATCHED BY SOURCE-Klauseln werden ausgeführt, wenn eine Zielzeile basierend auf merge_condition mit keiner Zeile in der Quelltabelle übereinstimmt und not_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:check marked yes Databricks SQL SQL-Warehouse Version 2022.35 oder höher check marked yes Databricks Runtime 11.2 und höher

      Sie können DEFAULT als expr 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, wenn merge_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 Sie not_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. Jede WHEN NOT MATCHED BY SOURCE-Klausel, mit Ausnahme der letzten, muss ein not_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 auf merge_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