Поделиться через


MERGE INTO;

Область применения: флажок Databricks SQL флажок Databricks Runtime

Выполняет слияние набора обновлений, вставок и удалений на основе исходной таблицы в целевую таблицу Delta.

Эта инструкция поддерживается только для таблиц Delta Lake.

Эта страница содержит сведения об использовании правильного синтаксиса с командой MERGE . Дополнительные сведения об использовании операций для управления данными см. в таблице Upsert в таблице Delta Lake с помощью MERGE слияния.

Синтаксис

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

Параметры

  • WITH SCHEMA EVOLUTION

    Область применения: флажок Databricks Runtime 15.2 и выше

    Включает автоматическую эволюцию схемы для этой MERGE операции. При включении схема целевой разностной таблицы автоматически обновляется, чтобы она соответствовала схеме исходной таблицы.

  • target_table_name

    Имя таблицы, которое определяет изменяемую таблицу. Таблица, на которую указывает ссылка, должна быть таблицей Delta.

    Таблица не должна быть внешней таблицей.

  • target_alias

    Псевдоним таблицы для целевой таблицы. Псевдоним не должен включать список столбцов.

  • source_table_reference

    Имя таблицы, которое определяет исходную таблицу, объединяемую в целевую таблицу.

  • source_alias

    Псевдоним таблицы для исходной таблицы. Псевдоним не должен включать список столбцов.

  • ON merge_condition

    Объединение строк из одного отношения с строками из другого отношения. Выражение с логическим типом возвращаемого значения.

  • WHEN MATCHED [ AND matched_condition]

    Предложения WHEN MATCHED выполняются, когда исходная строка соответствует строке целевой таблицы на основе условия merge_condition, а также (необязательно) условия match_condition.

  • matched_action

    • DELETE

      Удаляет соответствующую целевую строку таблицы.

      Несколько соответствий разрешены, если соответствия удаляются безусловно. Безусловное удаление не является неоднозначным, даже если имеется несколько совпадений.

    • UPDATE

      Обновляет соответствующую целевую строку таблицы.

      Чтобы заменить все столбцы целевой таблицы Delta соответствующими столбцами исходного набора данных, используйте UPDATE SET *. Это эквивалентно использованию UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] для всех столбцов целевой таблицы Delta. Следовательно, это действие предполагает, что в исходной таблице содержатся те же столбцы, что и в целевой таблице, иначе запрос выдаст ошибку анализа.

      Примечание.

      Это поведение изменяется при включенной автоматической эволюции схемы. Дополнительные сведения см. в статье "Автоматическая эволюция схемы" для слияния Delta Lake.

      Область применения: флажок Databricks SQL флажок Databricks Runtime 11.3 LTS и выше

      Можно указать DEFAULT , как expr явно обновить столбец до значения по умолчанию.

    Если существует несколько предложений WHEN MATCHED, они вычисляются в том порядке, в котором указаны. Каждое предложение WHEN MATCHED, кроме последнего, должно иметь значение matched_condition. В противном случае запрос возвращает ошибку NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION .

    Если не выполняется ни одно из условий WHEN MATCHED для пары исходной и целевой строк, соответствующих merge_condition, целевая строка остается неизменной.

  • WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition]

    Предложения WHEN NOT MATCHED вставляют строку, если исходная строка не соответствует какой-либо целевой строке на основе критерия merge_condition и (необязательно) критерия not_matched_condition.

    Область применения: флажок Databricks SQL флажок Databricks Runtime 12.2 LTS и выше

    WHEN NOT MATCHED BY TARGET можно использовать в качестве псевдонима для WHEN NOT MATCHED.

    not_matched_condition должно быть логическим выражением.

    • INSERT *

      Заменяет все столбцы целевой разностной таблицы Delta соответствующими столбцами исходного набора данных. Это эквивалентно использованию INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) для всех столбцов целевой таблицы Delta. Для выполнения этого действия необходимо, чтобы в исходной таблице были те же столбцы, что и в целевой.

      Примечание.

      Это поведение изменяется при включенной автоматической эволюции схемы. Дополнительные сведения см. в статье "Автоматическая эволюция схемы" для слияния Delta Lake.

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

      Новая строка создается на основе указанного столбца и соответствующих выражений. Нет необходимости указывать все столбцы в целевой таблице. Для неуказанных целевых столбцов, вставляется столбец по умолчанию, или NULL, если таковой не существует.

      Область применения: флажок Databricks SQL флажок Databricks Runtime 11.3 LTS и выше

      Можно указать DEFAULT как выражение, чтобы явно вставить столбец по умолчанию для целевого столбца.

    Если существует несколько предложений WHEN NOT MATCHED, они вычисляются в том порядке, в котором указаны. Все предложения WHEN NOT MATCHED, за исключением последнего, должны иметь условия not_matched_condition. В противном случае запрос возвращает ошибку NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION .

  • WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition]

    Область применения: флажок Databricks SQL флажок Databricks Runtime 12.2 LTS и выше

    WHEN NOT MATCHED BY SOURCE предложения выполняются, если целевая строка не соответствует ни одной строке в исходной таблице на merge_condition not_match_by_source_condition основе значения true.

    not_matched_by_source_condition должно быть логическим выражением, которое ссылается только на столбцы из целевой таблицы.

  • not_matched_by_source_action

    • DELETE

      Удаляет целевую строку таблицы.

    • UPDATE

      Обновляет целевую строку таблицы. expr Может ссылаться только на столбцы из целевой таблицы, в противном случае запрос вызовет ошибку анализа.

      Область применения: флажок Databricks SQL флажок Databricks Runtime 11.3 LTS и выше

      Можно указать DEFAULT , как expr явно обновить столбец до значения по умолчанию.

    Внимание

    WHEN NOT MATCHED BY SOURCE Добавление предложения для обновления или удаления целевых строк при merge_condition оценке false может привести к большому количеству изменяемых целевых строк. Чтобы повысить производительность, примените not_matched_by_source_conditions, чтобы ограничить количество целевых строк, обновленных или удаленных.

    Если существует несколько WHEN NOT MATCHED BY SOURCE clauses, то они вычисляются в указанном порядке. Каждое предложение WHEN NOT MATCHED BY SOURCE, кроме последнего, должно иметь значение not_matched_by_source_condition. В противном случае запрос возвращает ошибку NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION .

    Если ни одно из WHEN NOT MATCHED BY SOURCE условий не соответствует целевой строке, которая не соответствует ни одной строке в исходной таблице на основе merge_condition, то целевая строка остается без изменений.

Внимание

MERGE операции завершаются ошибкой DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE , если несколько строк в исходной таблице совпадают с той же строкой в целевой таблице в зависимости от условий, указанных в ON предложениях и WHEN MATCHED предложениях. Согласно семантике слияния SQL, этот тип операции обновления неоднозначно, поскольку неясно, какая исходная строка должна использоваться для обновления соответствующей целевой строки. Вы можете предварительно обработать исходную таблицу, чтобы исключить возможность множественных совпадений. См. пример отслеживания измененных данных. В этом примере предварительно обрабатывается набор данных изменений (исходный набор данных), чтобы сохранить только последнее изменение каждого ключа перед применением этого изменения в целевой таблице Delta. В Databricks Runtime 15.4 LTS и ниже MERGE рассматриваются только условия в ON предложении перед оценкой нескольких совпадений.

Примеры

Вы можете использовать MERGE INTO для сложных операций, таких как дедупликация данных, изменение изменений, применение операций SCD Type 2 и т. д. Ознакомьтесь с Upsert в таблице Delta Lake с помощью слияния в нескольких примерах.

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