Freigeben über


MERGE INTO

Gilt für: durch Häkchen mit „Ja“ markiert Databricks SQL durch Häkchen mit „Ja“ markiert 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: Häkchen gesetzt ja 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.

  • target_table_name

    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.

  • 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 Schemaentwicklung aktiviert wird. Weitere Informationen finden Sie unter Automatische Schemaentwicklung für Delta Lake-Merge.

      Gilt für: Häkchen ja Databricks SQL Häkchen Databricks Runtime 11.3 LTS 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: Häkchen ja Databricks SQL Häkchen Databricks Runtime 12.2 LTS 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 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: Häkchen ja Databricks SQL Häkchen 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 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: Häkchen ja Databricks SQL Häkchen Databricks Runtime 12.2 LTS 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: Häkchen ja Databricks SQL Häkchen Databricks Runtime 11.3 LTS 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

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