MERGE INTO
Область применения: Databricks SQL
Databricks Runtime
Объединяет набор обновлений, вставок и удалений из исходной таблицы в целевую таблицу Delta.
Это утверждение поддерживается только для таблиц Delta Lake.
Эта страница содержит сведения об использовании правильного синтаксиса с командой MERGE
. Для получения дополнительной информации об использовании операций для управления данными см. 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
условий не будет иметь значение true для целевой строки, которая не соответствует ни одной строке в исходной таблице на основе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 и т. д. См. пример вставки в таблицу 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