MERGE INTO
Gäller för: Databricks SQL 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: 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.-
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.
-
Ett tabellalias för måltabellen. Aliaset får inte innehålla en kolumnlista.
-
Ett tabellnamn som identifierar källtabellen som ska sammanfogas i måltabellen.
-
Ett tabellalias för källtabellen. Aliaset får inte innehålla en kolumnlista.
-
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 valfriamatch_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 motsvararUPDATE 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: Databricks SQL Databricks Runtime 11.3 LTS och senare
Du kan ange
DEFAULT
attexpr
kolumnen uttryckligen ska uppdateras till standardvärdet.
Om det finns flera
WHEN MATCHED
satser utvärderas de i den ordning de anges. VarjeWHEN MATCHED
sats, förutom den sista, måste ha enmatched_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 matcharmerge_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 valfrianot_matched_condition
.Gäller för: Databricks SQL Databricks Runtime 12.2 LTS och senare
WHEN NOT MATCHED BY TARGET
kan användas som ett alias förWHEN 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: Databricks SQL 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. AllaWHEN NOT MATCHED
satser, utom den sista, måste hanot_matched_condition
s. 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: Databricks SQL 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 valfrianot_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: Databricks SQL Databricks Runtime 11.3 LTS och senare
Du kan ange
DEFAULT
attexpr
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ärdetmerge_condition
är falskt kan det leda till att ett stort antal målrader ändras. För bästa prestanda använder dunot_matched_by_source_condition
s för att begränsa antalet målrader som har uppdaterats eller tagits bort.Om det finns flera
WHEN NOT MATCHED BY SOURCE clauses
utvärderas de i den ordning de anges. VarjeWHEN NOT MATCHED BY SOURCE
sats, förutom den sista, måste ha ennot_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älltabellenmerge_condition
baserat 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