MERGE INTO

Gäller för:check marked yes Databricks SQL check marked yes Databricks Runtime

Sammanfogar en uppsättning uppdateringar, infogningar och borttagningar baserat på en källtabell till en Delta-måltabell.

Den här instruktionen stöds endast för Delta Lake-tabeller.

Den här sidan innehåller information om hur du använder rätt syntax med MERGE kommandot . Mer information om hur du använder MERGE åtgärder för att hantera dina data finns i Upsert i en Delta Lake-tabell med hjälp av sammanslagning.

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 } } [, ...] }

Parametrar

  • target_table_name

    Ett tabellnamn som identifierar den tabell som ändras. Tabellen som refereras måste vara en Delta-tabell.

    Tabellen får inte vara en sekundär tabell.

  • target_alias

    Ett tabellaliasför måltabellen. Aliaset får inte innehålla en kolumnlista.

  • source_table_reference

    Ett tabellnamn som identifierar källtabellen som ska sammanfogas i måltabellen.

  • source_alias

    Ett tabellalias för källtabellen. Aliaset får inte innehålla en kolumnlista.

  • merge_condition

    Hur raderna från en relation kombineras med raderna i en annan relation. Ett uttryck med returtypen BOOLEAN.

  • WHEN MATCHED [ AND matched_condition]

    WHEN MATCHED -satser körs när en källrad matchar en måltabellrad baserat på merge_condition och den valfria match_condition.

  • matched_action

    • DELETE

      Tar bort den matchande måltabellraden.

      Flera matchningar tillåts när matchningar tas bort ovillkorligt. En ovillkorlig borttagning är inte tvetydig, även om det finns flera matchningar.

    • UPDATE

      Uppdateringar den matchade måltabellraden.

      Om du vill uppdatera alla kolumner i måldeltabeln med motsvarande kolumner i källdatauppsättningen använder du UPDATE SET *. Detta motsvarar UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] för alla kolumner i måldeltattabellen. Därför förutsätter den här åtgärden att källtabellen har samma kolumner som de i måltabellen, annars utlöser frågan ett analysfel.

      Kommentar

      Det här beteendet ändras när automatisk schemamigrering är aktiverad. Mer information finns i Automatisk schemautveckling för Delta Lake-sammanslagning .

      Gäller för:check marked yes Databricks SQL SQL Warehouse version 2022.35 eller senare check marked yes Databricks Runtime 11.2 och senare

      Du kan ange DEFAULT att expr kolumnen uttryckligen ska uppdateras till standardvärdet.

    Om det finns flera WHEN MATCHED satser utvärderas de i den ordning de anges. Varje WHEN MATCHED sats, förutom den sista, måste ha en matched_condition. Annars returnerar frågan ett NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION fel.

    Om inget av WHEN MATCHED villkoren utvärderas till sant för ett käll- och målradpar som matchar merge_condition, lämnas målraden oförändrad.

  • WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition]

    WHEN NOT MATCHED -satser infogar en rad när en källrad inte matchar någon målrad baserat på merge_condition och den valfria not_matched_condition.

    Gäller för:check marked yes Databricks SQL check marked yes Databricks Runtime 12.1 och senare

    WHEN NOT MATCHED BY TARGET kan användas som ett alias för WHEN NOT MATCHED.

    not_matched_condition måste vara ett booleskt uttryck.

    • INSERT *

      Infogar alla kolumner i måldeltabeln med motsvarande kolumner i källdatauppsättningen. Detta motsvarar INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) för alla kolumner i måldeltattabellen. Den här åtgärden kräver att källtabellen har samma kolumner som de i måltabellen.

      Kommentar

      Det här beteendet ändras när automatisk schemamigrering är aktiverad. Mer information finns i Automatisk schemautveckling för Delta Lake-sammanslagning .

    • INSERT ( ... ) VALUES ( ... )

      Den nya raden genereras baserat på den angivna kolumnen och motsvarande uttryck. Alla kolumner i måltabellen behöver inte anges. För ospecificerade målkolumner infogas kolumnstandarden eller NULL om ingen finns.

      Gäller för:check marked yes Databricks SQL SQL Warehouse version 2022.35 eller senare check marked yes Databricks Runtime 11.2 och senare

      Du kan ange DEFAULT som ett uttryck för att uttryckligen infoga kolumnstandarden för en målkolumn.

    Om det finns flera WHEN NOT MATCHED satser utvärderas de i den ordning de anges. Alla WHEN NOT MATCHED satser, utom den sista, måste ha not_matched_conditions. Annars returnerar frågan ett NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION fel.

  • WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition]

    Gäller för:check marked yes Databricks SQL check marked yes Databricks Runtime 12.1 och senare

    WHEN NOT MATCHED BY SOURCE -satser körs när en målrad inte matchar några rader i källtabellen baserat på merge_condition och det valfria not_match_by_source_condition utvärderas till sant.

    not_matched_by_source_condition måste vara ett booleskt uttryck som endast refererar till kolumner från måltabellen.

  • not_matched_by_source_action

    • DELETE

      Tar bort måltabellraden.

    • UPDATE

      Uppdateringar måltabellraden. expr kan bara referera till kolumner från måltabellen, annars utlöser frågan ett analysfel.

      Gäller för:check marked yes Databricks SQL SQL Warehouse version 2022.35 eller senare check marked yes Databricks Runtime 11.2 och senare

      Du kan ange DEFAULT att expr kolumnen uttryckligen ska uppdateras till standardvärdet.

    Viktigt!

    Om du lägger till en WHEN NOT MATCHED BY SOURCE sats för att uppdatera eller ta bort målrader när värdet merge_condition är falskt kan det leda till att ett stort antal målrader ändras. För bästa prestanda använder du not_matched_by_source_conditions för att begränsa antalet målrader som har uppdaterats eller tagits bort.

    Om det finns flera WHEN NOT MATCHED BY SOURCE clausesutvärderas de i den ordning de anges. Varje WHEN NOT MATCHED BY SOURCE sats, förutom den sista, måste ha en not_matched_by_source_condition. Annars returnerar frågan ett NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION fel.

    Om inget av WHEN NOT MATCHED BY SOURCE villkoren utvärderas till true för en målrad som inte matchar några rader i källtabellen merge_conditionbaserat på , lämnas målraden oförändrad.

Viktigt!

En MERGE åtgärd kan misslyckas med ett DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE fel om flera rader i källdatauppsättningen matchar och försöker uppdatera samma rader i måldeltabeln. Enligt SQL-semantiken för sammanslagning är en sådan uppdateringsåtgärd tvetydig eftersom det är oklart vilken källrad som ska användas för att uppdatera den matchade målraden. Du kan förbearbeta källtabellen för att eliminera risken för flera matchningar. Se exemplet För ändring av datainsamling – det förbearbetar ändringsdatauppsättningen (det vill säga källdatauppsättningen) för att endast behålla den senaste ändringen för varje nyckel innan ändringen tillämpas i måldeltabeln.

Exempel

Du kan använda MERGE INTO för komplexa åtgärder som att deduplicera data, utöka ändringsdata, tillämpa SCD Typ 2-åtgärder osv. Se Upsert i en Delta Lake-tabell med sammanslagning för några exempel.

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