MERGE INTO
Platí pro: Databricks SQL
Databricks Runtime
Sloučí sadu aktualizací, vložení a odstranění záznamů vycházející ze zdrojové tabulky do cílové tabulky Delta.
Tento výrok je podporován pouze pro tabulky Delta Lake.
Tato stránka obsahuje podrobnosti o použití správné syntaxe s příkazem MERGE
. Další pokyny MERGE
ke správě dat najdete v tématu Upsert do tabulky Delta Lake pomocí slučovacích.
Syntaxe
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 } } [, ...] }
Parametry
WITH SCHEMA EVOLUTION
Platí pro:
Databricks Runtime 15.2 a vyšší
Umožňuje automatickému vývoji schématu pro tuto operaci
MERGE
. Pokud je tato možnost povolená, schéma cílové tabulky Delta se automaticky aktualizuje tak, aby odpovídalo schématu zdrojové tabulky.-
Název tabulky identifikující upravenou tabulku. Odkazovaná tabulka musí být tabulka Delta.
Název nesmí obsahovat specifikaci možností.
Tabulka nesmí být cizí tabulkou.
-
Alias pro cílovou tabulku
. Alias nesmí obsahovat seznam sloupců. -
Název tabulky , který identifikuje zdrojovou tabulku ke sloučení do cílové tabulky.
-
Alias tabulky pro zdrojovou tabulku. Alias nesmí obsahovat seznam sloupců.
ZAPNUTO merge_condition
Jak se řádky z jedné relace zkombinují s řádky jiné relace. Výraz s návratovým typem logické hodnoty.
WHEN MATCHED [ AND
matched_condition]
WHEN MATCHED
klauzule se spustí, když zdrojový řádek odpovídá cílovému řádku tabulky na základěmerge_condition
a volitelnéhomatch_condition
.matched_action
DELETE
Odstraní odpovídající cílový řádek tabulky.
Pokud jsou shody bezpodmínečně odstraněny, je povoleno více shod. Nepodmíněné odstranění není nejednoznačné, i když existuje více shod.
UPDATE
Aktualizuje odpovídající cílový řádek tabulky.
Chcete-li aktualizovat všechny sloupce cílové tabulky Delta odpovídajícími sloupci zdrojové datové sady, použijte
UPDATE SET *
. To odpovídáUPDATE SET col1 = source.col1 [, col2 = source.col2 ...]
pro všechny sloupce cílové tabulky Delta. Proto tato akce předpokládá, že zdrojová tabulka má stejné sloupce jako sloupce v cílové tabulce, jinak dotaz vyvolá chybu analýzy.Poznámka:
Toto chování se změní při povolení automatického vývoje schématu. Podrobnosti naleznete v kapitole Automatický vývoj schématu v Delta Lake při slučování.
Platí pro:
Databricks SQL
Databricks Runtime 11.3 LTS a vyšší
Jako
expr
můžete zadatDEFAULT
, aby se sloupec explicitně aktualizoval na výchozí hodnotu.
Pokud existuje více
WHEN MATCHED
klauzulí, vyhodnocují se v uvedeném pořadí. KaždáWHEN MATCHED
klauzule, s výjimkou poslední, musí mít .matched_condition
V opačném případě dotaz vrátí chybu NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION .Pokud se žádná z
WHEN MATCHED
podmínek nevyhodnotí jako true pro dvojici zdrojového a cílového řádku, která odpovídá hodnotěmerge_condition
, zůstane cílový řádek beze změny.WHEN NOT MATCHED [BY TARGET] [ AND
not_matched_condition]
WHEN NOT MATCHED
klauzule vloží řádek, pokud zdrojový řádek neodpovídá žádnému cílovému řádku na základěmerge_condition
a volitelnéhonot_matched_condition
.Platí pro:
Databricks SQL
Databricks Runtime 12.2 LTS a vyšší
WHEN NOT MATCHED BY TARGET
lze použít jako alias proWHEN NOT MATCHED
.not_matched_condition
musí být logický výraz.INSERT *
Vloží všechny sloupce cílové tabulky Delta s odpovídajícími sloupci zdrojové datové sady. To odpovídá
INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...])
pro všechny sloupce cílové tabulky Delta. Tato akce vyžaduje, aby zdrojová tabulka obsahuje stejné sloupce jako sloupce v cílové tabulce.Poznámka:
Toto chování se změní při povolení automatického vývoje schématu. Podrobnosti najdete v automatické evoluci schématu pro slučování v Delta Lake.
INSERT ( ... ) VALUES ( ... )
Nový řádek se vygeneruje na základě zadaného sloupce a odpovídajících výrazů. Není nutné zadávat všechny sloupce v cílové tabulce. U nezadaných cílových sloupců se vloží výchozí sloupec nebo
NULL
, pokud žádný neexistuje.Platí pro:
Databricks SQL
Databricks Runtime 11.3 LTS a vyšší
Jako výraz můžete zadat
DEFAULT
a explicitně vložit výchozí hodnotu do cílového sloupce.
Pokud existuje více
WHEN NOT MATCHED
klauzulí, vyhodnocují se v uvedeném pořadí. VšechnyWHEN NOT MATCHED
klauzule, s výjimkou poslední, musí mítnot_matched_condition
s. V opačném případě dotaz vrátí chybu NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION .WHEN NOT MATCHED BY SOURCE [ AND
not_matched_by_source_condition]
Platí pro:
Databricks SQL
Databricks Runtime 12.2 LTS a vyšší
WHEN NOT MATCHED BY SOURCE
klauzule se spustí, když cílový řádek neodpovídá žádnému řádku ve zdrojové tabulce na základěmerge_condition
a volitelná podmínkanot_match_by_source_condition
se vyhodnotí jako pravda.not_matched_by_source_condition
musí být logický výraz, který odkazuje pouze na sloupce z cílové tabulky.not_matched_by_source_action
DELETE
Odstraní řádek cílové tabulky.
UPDATE
Aktualizuje řádek cílové tabulky.
expr
může odkazovat pouze na sloupce z cílové tabulky, jinak dotaz vyvolá chybu analýzy.Platí pro:
Databricks SQL
Databricks Runtime 11.3 LTS a vyšší
Jako
expr
můžete zadatDEFAULT
, aby se sloupec explicitně aktualizoval na výchozí hodnotu.
Důležité
Přidání klauzule
WHEN NOT MATCHED BY SOURCE
k aktualizaci nebo odstranění cílových řádků, když semerge_condition
vyhodnotí jako nepravda, může vést k úpravě velkého počtu cílových řádků. Pokud chcete dosáhnout nejlepšího výkonu, použijtenot_matched_by_source_condition
, abyste omezili počet aktualizovaných nebo odstraněných cílových řádků.Pokud existuje více
WHEN NOT MATCHED BY SOURCE clauses
, vyhodnotí se v pořadí, v jakém jsou zadány. KaždáWHEN NOT MATCHED BY SOURCE
klauzule, s výjimkou poslední, musí mít .not_matched_by_source_condition
V opačném případě dotaz vrátí chybu NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION .Pokud se žádná z
WHEN NOT MATCHED BY SOURCE
podmínek vyhodnotí jako true pro cílový řádek, který neodpovídá žádným řádkům ve zdrojové tabulce na základěmerge_condition
, zůstane cílový řádek beze změny.
Důležité
MERGE
operace selžou s chybou DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE, pokud více než jeden řádek ve zdrojové tabulce odpovídá stejnému řádku v cílové tabulce na základě podmínek zadaných v klauzulích ON
a WHEN MATCHED
. Podle sémantiky SQL sloučení je tento typ operace aktualizace nejednoznačný, protože není jasné, který zdrojový řádek by se měl použít k aktualizaci odpovídajícího cílového řádku. Můžete zdrojovou tabulku předem zpracovat, abyste vyloučili možnost více shod. Podívejte se na příklad zachycení dat změn. Tento příklad předzpracuje datovou sadu změn (zdrojovou datovou sadu), aby před použitím této změny do cílové tabulky Delta zachovala pouze nejnovější změnu pro každý klíč. V Databricks Runtime 15.4 LTS a níže MERGE
bere v úvahu podmínky pouze v ON
klauzuli před vyhodnocením více shod.
Příklady
MERGE INTO
můžete použít pro složité operace, jako je odstranění duplicitních dat, upsertace dat změn, použití operací typu SCD 2 atd. Několik příkladů najdete v tématu Upsert do tabulky Delta Lake pomocí sloučení.
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