Sdílet prostřednictvím


MERGE INTO

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

Sloučí set aktualizací, vložení a odstranění ze zdrojového table do cílového Delta table.

Tento příkaz je podporován pouze pro Delta Lake tables.

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 table Delta Lake pomocí slučovacího.

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

Parameters

  • WITH SCHEMA EVOLUTION

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

    Umožňuje automatickou schema evoluci pro tuto MERGE operaci. Pokud je tato možnost povolená, schema cílového rozdílového table se automaticky aktualizuje tak, aby odpovídaly schema zdrojového table.

  • target_table_name

    Název Table identifikující table, který je upravován. Odkazovaný table musí být Delta table.

    Název nesmí obsahovat specifikaci možností.

    table nesmí být cizím table.

  • target_alias

    Alias Table pro cíl tablejako. Alias nesmí obsahovat columnlist.

  • source_table_reference

    Název Table identifikující zdroj table, který se má sloučit do cílového table.

  • source_alias

    Alias Table pro zdroj table. Alias nesmí obsahovat columnlist.

  • 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 table řádku na základě merge_condition a volitelného match_condition.

  • matched_action

    • DELETE

      Odstraní odpovídající cílový table řádek.

      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 table.

      Pokud chcete update všechny columns cílový Delta table s odpovídajícím columns ze zdrojové datové sady, použijte UPDATE SET *. To odpovídá UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] pro všechny columns cílové Delta table. Proto tato akce předpokládá, že zdroj table má stejné columns jako cílový table; v opačném případě dotaz vyvolá chybu analýzy.

      Poznámka:

      Toto chování se změní, když je povolen automatický vývoj schema. Pro podrobnosti se podívejte na automatický vývoj pro schema 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šší

      Jako expr můžete zadat DEFAULT explicitně updatecolumn 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 insert řádku, pokud zdrojový řádek neodpovídá žádnému cílovému řádku na základě merge_condition a volitelného 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 columns cílové Delty table s odpovídajícími columns ze zdrojové datové sady. To odpovídá INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) pro všechny columns cílového Delta table. Tato akce vyžaduje, aby zdroj table měl stejný columns jako ty v cílovém table.

      Poznámka:

      Toto chování se změní, když je povolen automatický vývoj schema. Podrobnosti najdete v části o automatickém vývoji pro sloučení Delta Lake schema.

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

      Nový řádek se vygeneruje na základě zadaného column a odpovídajících výrazů. Není nutné zadávat všechny columns v cílovém table. Pro nespecifikovanou cílovou columnsse vloží výchozí column, nebo NULL, neexistuje-li žádný.

      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, který explicitně insert výchozí column cílového column.

    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 spustí, když cílový řádek neodpovídá žádným řádkům ve zdrojovém table na základě merge_condition a volitelný not_match_by_source_condition vyhodnotí jako true.

    not_matched_by_source_condition musí být Booleovský logický výraz, který odkazuje pouze na columns z cílového table.

  • not_matched_by_source_action

    • DELETE

      Odstraní cílový řádek table.

    • UPDATE

      Aktualizuje cílový table řádek. expr může odkazovat pouze na columns z cílového table, 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šší

      Jako expr můžete zadat DEFAULT explicitně updatecolumn výchozí hodnotu.

    Důležité

    Přidání klauzule WHEN NOT MATCHED BY SOURCE do update nebo odstranění cílových řádků, když se merge_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, aplikujte not_matched_by_source_conditionna limit odpovídající 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 podmínek WHEN NOT MATCHED BY SOURCE nevyhodnotí jako pravda pro cílový řádek, který neodpovídá žádným řádkům ve zdrojovém table na základě merge_condition, cílový řádek zůstane 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ém table odpovídá stejnému řádku v cílovém table na základě podmínek zadaných v klauzulích ON a WHEN MATCHED. Podle sémantiky SQL sloučení je tento typ operace update nejednoznačný, protože není jasné, který zdrojový řádek by se měl použít pro update na odpovídající cílový řádek. Zdrojový table můžete 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 sadu změn (zdrojovou sadu dat) tak, aby pro každý klíč zachoval pouze nejnovější změnu před aplikací této změny do cílové Delta table. 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 deduplikace dat, upsertace změnových dat, použití operací typu SCD 2 atd. Několik příkladů najdete v tématu Upsert do Delta Lake table pomocí operace spojení.

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