MERGE INTO

Gäller för: markerad ja Databricks SQL markerad ja 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 [ 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 } } [, ...] }

Parametrar

  • WITH SCHEMA EVOLUTION

    Gäller för: markerad ja Databricks Runtime 15.2 och senare

    Aktiverar automatisk schemautveckling för den här MERGE åtgärden. När det är aktiverat uppdateras schemat för deltatabellen för mål automatiskt så att det matchar källtabellens schema.

  • 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 tabellalias fö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

      Uppdaterar 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 schemautveckling är aktiverad. Mer information finns i Automatisk schemautveckling för Delta Lake-sammanslagning .

      Gäller för: markerad ja Databricks SQL markerad ja Databricks Runtime 11.3 LTS 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: markerad ja Databricks SQL markerad ja Databricks Runtime 12.2 LTS 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 schemautveckling ä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: markerad ja Databricks SQL markerad ja Databricks Runtime 11.3 LTS 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: markerad ja Databricks SQL markerad ja Databricks Runtime 12.2 LTS 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

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

      Gäller för: markerad ja Databricks SQL markerad ja Databricks Runtime 11.3 LTS 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!

MERGE åtgärder misslyckas med ett DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE fel om mer än en rad i källtabellen matchar samma rad i måltabellen baserat på de villkor som anges i ON - och-satserna WHEN MATCHED . Enligt SQL-semantiken för sammanslagning är den här typen av 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 på ändringsdatainsamling. I det här exemplet förbearbetas ändringsdatauppsättningen (källdatauppsättningen) för att endast behålla den senaste ändringen för varje nyckel innan ändringen tillämpas i deltatabellen för mål. I Databricks Runtime 15.4 LTS och nedan tar MERGE du endast hänsyn till villkoren i ON satsen innan du utvärderar flera matchningar.

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

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