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
операции. При включении схема целевой разностной таблицы автоматически обновляется, чтобы она соответствовала схеме исходной таблицы.-
Имя таблицы, которое определяет изменяемую таблицу. Таблица, на которую указывает ссылка, должна быть таблицей Delta.
Таблица не должна быть внешней таблицей.
-
Псевдоним таблицы для целевой таблицы. Псевдоним не должен включать список столбцов.
-
Имя таблицы, которое определяет исходную таблицу, объединяемую в целевую таблицу.
-
Псевдоним таблицы для исходной таблицы. Псевдоним не должен включать список столбцов.
-
Объединение строк из одного отношения с строками из другого отношения. Выражение с логическим типом возвращаемого значения.
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_condition
s, чтобы ограничить количество целевых строк, обновленных или удаленных.Если существует несколько
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