MERGE INTO

Platí pro:zaškrtnutí označeného ano Databricks SQL zaškrtnutí označeného ano Databricks Runtime

Sloučí sadu aktualizací, vložení a odstranění na základě zdrojové tabulky do cílové tabulky Delta.

Tento příkaz 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 ke správě MERGE dat najdete v tématu Upsert do tabulky Delta Lake pomocí sloučení.

Syntaxe

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

Parametry

  • target_table_name

    Název tabulky identifikující upravenou tabulku. Odkazovaná tabulka musí být tabulka Delta.

    Tabulka nesmí být cizí tabulkou.

  • target_alias

    Alias tabulky pro cílovou tabulku. Alias nesmí obsahovat seznam sloupců.

  • source_table_reference

    Název tabulky identifikující zdrojovou tabulku, která se má sloučit do cílové tabulky.

  • source_alias

    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 provádějí, když zdrojový řádek odpovídá cílovému řádku tabulky na merge_condition základě a volitelného match_conditionřádku .

  • 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

      Aktualizace 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 ...] všem sloupcům 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í, když je povolena automatická migrace schématu. Podrobnosti najdete v tématu Automatické vývoj schématu pro sloučení Delta Lake.

      Platí pro:zaškrtnutí označeného ano Databricks SQL zaškrtnutí označeného ano Databricks Runtime 11.3 LTS a vyšší

      Můžete určit DEFAULT , jak expr sloupec explicitně aktualizovat 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 merge_condition základě a volitelné not_matched_condition.

    Platí pro:zaškrtnutí označeného ano Databricks SQL zaškrtnutí označeného ano Databricks Runtime 12.2 LTS a vyšší

    WHEN NOT MATCHED BY TARGET lze použít jako alias pro WHEN 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 ...]) všem sloupcům 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í, když je povolena automatická migrace schématu. Podrobnosti najdete v tématu Automatické vývoj schématu pro sloučení 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:zaškrtnutí označeného ano Databricks SQL zaškrtnutí označeného ano Databricks Runtime 11.3 LTS a vyšší

      Jako výraz můžete zadat DEFAULT explicitní vložení výchozího sloupce pro cílový sloupec.

    Pokud existuje více WHEN NOT MATCHED klauzulí, vyhodnocují se v uvedeném pořadí. Všechny WHEN NOT MATCHED klauzule, s výjimkou poslední, musí mít not_matched_conditions. 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:zaškrtnutí označeného ano Databricks SQL zaškrtnutí označeného ano Databricks Runtime 12.2 LTS a vyšší

    WHEN NOT MATCHED BY SOURCE Klauzule se provádějí, když cílový řádek neodpovídá žádným řádkům ve zdrojové tabulce na merge_condition základě a volitelné not_match_by_source_condition vyhodnotí hodnotu true.

    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

      Aktualizace řádku cílové tabulky. expr může odkazovat pouze na sloupce z cílové tabulky, jinak dotaz vyvolá chybu analýzy.

      Platí pro:zaškrtnutí označeného ano Databricks SQL zaškrtnutí označeného ano Databricks Runtime 11.3 LTS a vyšší

      Můžete určit DEFAULT , jak expr sloupec explicitně aktualizovat na výchozí hodnotu.

    Důležité

    WHEN NOT MATCHED BY SOURCE Přidání klauzule pro aktualizaci nebo odstranění cílových řádků, když merge_condition se 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žijte not_matched_by_source_conditionomezení počtu 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 nevyhodnotí jako true pro cílový řádek, který neodpovídá žádným řádkům ve zdrojové tabulce na základě této merge_conditiontabulky, zůstane cílový řádek beze změny.

Důležité

MERGE Operace může selhat s chybou DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE, pokud se několik řádků zdrojové datové sady shoduje a pokusí se aktualizovat stejné řádky cílové tabulky Delta. Podle sémantiky sloučení SQL je taková 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. Zdrojová tabulka můžete předem zpracovat, abyste vyloučili možnost více shod. Podívejte se na příklad zachytávání dat změn – předzpracuje datovou sadu změn (tj. 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íč.

Příklady

Můžete použít MERGE INTO pro složité operace, jako je odstranění duplicitních dat, upsertování 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