Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:
Databricks SQL
Databricks Runtime
Объединяет набор обновлений, вставок и удалений из исходной таблицы в целевую таблицу Delta.
Это утверждение поддерживается только для таблиц Delta Lake.
Эта страница содержит сведения об использовании правильного синтаксиса с командой MERGE . Для получения дополнительной информации об использовании операций для управления данными см. MERGE.
Синтаксис
[ common_table_expression ]
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 } } [, ...] }
Параметры
-
Распространенные табличные выражения (CTE) — это один или несколько именованных запросов, которые можно повторно использовать несколько раз в основном блоке запросов, чтобы избежать повторяющихся вычислений или улучшить удобочитаемость сложных вложенных запросов.
WITH SCHEMA EVOLUTIONОбласть применения:
Databricks Runtime 15.2 и вышеВключает автоматическую эволюцию схемы для этой операции
MERGE. При включении схема целевой разностной таблицы автоматически обновляется, чтобы она соответствовала схеме исходной таблицы.-
Имя таблицы , указывающее таблицу, которая изменяется. Ссылающаяся таблица должна быть таблицей Delta.
Имя не должно включать указание параметров.
Таблица не должна быть внешней таблицей.
-
Псевдоним таблицы для целевой таблицы. Псевдоним не должен содержать список столбцов.
-
Имя таблицы , определяющее исходную таблицу, для объединения с целевой таблицей.
-
Псевдоним таблицы для исходной таблицы. Псевдоним не должен содержать список столбцов.
-
Как строки из одной реляции объединяются со строками из другой реляции. Выражение с булевым типом возвращаемого значения.
WHEN MATCHED [ ANDсоответствующее_условие]WHEN MATCHEDпредложения выполняются, когда исходная строка соответствует целевой строке таблицы на основеmerge_conditionи необязательнойmatch_condition.соответствующее_действие
DELETEУдаляет соответствующую целевую строку таблицы.
Несколько совпадений разрешены, когда совпадения удаляются безусловно. Безусловное удаление не является неоднозначным, даже если имеется несколько совпадений.
UPDATEОбновляет соответствующую целевую строку таблицы.
Чтобы обновить все столбцы целевой таблицы Delta с соответствующими столбцами исходного набора данных, используйте
UPDATE SET *. Это эквивалентноUPDATE SET col1 = source.col1 [, col2 = source.col2 ...]для всех столбцов целевой таблицы Delta. Поэтому это действие предполагает, что исходная таблица имеет те же столбцы, что и в целевой таблице, в противном случае запрос вызовет ошибку анализа.Примечание.
Это поведение изменяется при включенной автоматической эволюции схемы. Подробнее см. в разделе "Автоматическая эволюция схемы для слияния".
Область применения:
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не_совпадающее_условие]условия
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. Для этого действия требуется, чтобы исходная таблица содержит те же столбцы, что и в целевой таблице.Примечание.
Это поведение изменяется при включенной автоматической эволюции схемы. Подробнее см. в разделе "Автоматическая эволюция схемы для слияния".
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не_соответствует_условию_источника]Область применения:
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должно быть логическим выражением, которое ссылается только на столбцы из целевой таблицы.не_соответствует_действию_источника
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 и т. д. См. пример вставки в таблицу 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