MERGE INTO
Aplica-se a: Databricks SQL Databricks Runtime
Mescla um conjunto de atualizações, inserções e exclusões com base em uma tabela de origem em uma tabela Delta de destino.
Esta instrução é suportada apenas para tabelas Delta Lake.
Esta página contém detalhes para usar a sintaxe correta com o MERGE
comando. Consulte Upsert em uma tabela Delta Lake usando mesclagem para obter mais orientações sobre como usar MERGE
operações para gerenciar seus dados.
Sintaxe
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 } } [, ...] }
Parâmetros
WITH SCHEMA EVOLUTION
Aplica-se a: Databricks Runtime 15.2 e superior
Permite a evolução automática do esquema para esta
MERGE
operação. Quando habilitado, o esquema da tabela Delta de destino é atualizado automaticamente para corresponder ao esquema da tabela de origem.-
Um nome de tabela que identifica a tabela que está sendo modificada. A tabela referenciada deve ser uma tabela Delta.
O nome não deve incluir uma especificação de opções.
A mesa não deve ser uma mesa estrangeira.
-
Um alias de tabela para a tabela de destino. O alias não deve incluir uma lista de colunas.
-
Um nome de tabela que identifica a tabela de origem a ser mesclada na tabela de destino.
-
Um alias de tabela para a tabela de origem. O alias não deve incluir uma lista de colunas.
-
Como as linhas de uma relação são combinadas com as linhas de outra relação. Uma expressão com um tipo de retorno de BOOLEAN.
WHEN MATCHED [ AND
matched_condition]
WHEN MATCHED
As cláusulas são executadas quando uma linha de origem corresponde a uma linha da tabela de destino com base nomerge_condition
e no opcionalmatch_condition
.matched_action
DELETE
Exclui a linha da tabela de destino correspondente.
Várias correspondências são permitidas quando as correspondências são excluídas incondicionalmente. Uma exclusão incondicional não é ambígua, mesmo que haja várias correspondências.
UPDATE
Atualiza a linha da tabela de destino correspondente.
Para atualizar todas as colunas da tabela Delta de destino com as colunas correspondentes do conjunto de dados de origem, use
UPDATE SET *
. Isso é equivalente aUPDATE SET col1 = source.col1 [, col2 = source.col2 ...]
todas as colunas da tabela Delta de destino. Portanto, essa ação pressupõe que a tabela de origem tenha as mesmas colunas que as da tabela de destino, caso contrário, a consulta lançará um erro de análise.Nota
Esse comportamento muda quando a evolução automática do esquema está habilitada. Consulte Evolução automática do esquema para mesclagem Delta Lake para obter detalhes.
Aplica-se a: Databricks SQL Databricks Runtime 11.3 LTS e superior
Você pode especificar
DEFAULT
comoexpr
atualizar explicitamente a coluna para seu valor padrão.
Se houver várias
WHEN MATCHED
cláusulas, elas são avaliadas na ordem em que são especificadas. CadaWHEN MATCHED
cláusula, exceto a última, deve ter ummatched_condition
. Caso contrário, a consulta retornará um erro de NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION .Se nenhuma das
WHEN MATCHED
condições for avaliada como verdadeira para um par de linhas de origem e destino que corresponda aomerge_condition
, a linha de destino será mantida inalterada.WHEN NOT MATCHED [BY TARGET] [ AND
not_matched_condition]
WHEN NOT MATCHED
As cláusulas inserem uma linha quando uma linha de origem não corresponde a nenhuma linha de destino com base nomerge_condition
e no opcionalnot_matched_condition
.Aplica-se a: Databricks SQL Databricks Runtime 12.2 LTS e superior
WHEN NOT MATCHED BY TARGET
pode ser usado como um alias paraWHEN NOT MATCHED
.not_matched_condition
deve ser uma expressão booleana.INSERT *
Insere todas as colunas da tabela Delta de destino com as colunas correspondentes do conjunto de dados de origem. Isso é equivalente a
INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...])
todas as colunas da tabela Delta de destino. Essa ação requer que a tabela de origem tenha as mesmas colunas da tabela de destino.Nota
Esse comportamento muda quando a evolução automática do esquema está habilitada. Consulte Evolução automática do esquema para mesclagem Delta Lake para obter detalhes.
INSERT ( ... ) VALUES ( ... )
A nova linha é gerada com base na coluna especificada e nas expressões correspondentes. Todas as colunas na tabela de destino não precisam ser especificadas. Para colunas de destino não especificadas, o padrão da coluna é inserido ou
NULL
, se não existir.Aplica-se a: Databricks SQL Databricks Runtime 11.3 LTS e superior
Você pode especificar
DEFAULT
como uma expressão para inserir explicitamente o padrão de coluna para uma coluna de destino.
Se houver várias
WHEN NOT MATCHED
cláusulas, elas são avaliadas na ordem em que são especificadas. Todas asWHEN NOT MATCHED
cláusulas, exceto a última, devem ternot_matched_condition
s. Caso contrário, a consulta retornará um erro NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION .WHEN NOT MATCHED BY SOURCE [ AND
not_matched_by_source_condition]
Aplica-se a: Databricks SQL Databricks Runtime 12.2 LTS e superior
WHEN NOT MATCHED BY SOURCE
As cláusulas são executadas quando uma linha de destino não corresponde a nenhuma linha na tabela de origem com base no e omerge_condition
opcionalnot_match_by_source_condition
avalia como verdadeiro.not_matched_by_source_condition
deve ser uma expressão booleana que faça referência apenas a colunas da tabela de destino.not_matched_by_source_action
DELETE
Exclui a linha da tabela de destino.
UPDATE
Atualiza a linha da tabela de destino.
expr
só pode fazer referência a colunas da tabela de destino, caso contrário, a consulta lançará um erro de análise.Aplica-se a: Databricks SQL Databricks Runtime 11.3 LTS e superior
Você pode especificar
DEFAULT
comoexpr
atualizar explicitamente a coluna para seu valor padrão.
Importante
Adicionar uma
WHEN NOT MATCHED BY SOURCE
cláusula para atualizar ou excluir linhas de destino quando amerge_condition
avaliação é falsa pode levar à modificação de um grande número de linhas de destino. Para obter o melhor desempenho, apliquenot_matched_by_source_condition
s para limitar o número de linhas de destino atualizadas ou excluídas.Se houver vários
WHEN NOT MATCHED BY SOURCE clauses
, então eles são avaliados na ordem em que são especificados. CadaWHEN NOT MATCHED BY SOURCE
cláusula, exceto a última, deve ter umnot_matched_by_source_condition
. Caso contrário, a consulta retornará um erro NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION .Se nenhuma das
WHEN NOT MATCHED BY SOURCE
condições for avaliada como verdadeira para uma linha de destino que não corresponda a nenhuma linha na tabela de origem com base nomerge_condition
, a linha de destino será mantida inalterada.
Importante
MERGE
As operações falham com um erro DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE se mais de uma linha na tabela de origem corresponder à mesma linha na tabela de destino com base nas condições especificadas nas ON
cláusulas and WHEN MATCHED
. De acordo com a semântica SQL da mesclagem, esse tipo de operação de atualização é ambíguo porque não está claro qual linha de origem deve ser usada para atualizar a linha de destino correspondente. Você pode pré-processar a tabela de origem para eliminar a possibilidade de várias correspondências. Veja o exemplo de captura de dados de alteração. Este exemplo pré-processa o conjunto de dados de alteração (o conjunto de dados de origem) para reter apenas a alteração mais recente para cada chave antes de aplicar essa alteração na tabela Delta de destino. No Databricks Runtime 15.4 LTS e inferior, MERGE
só considera as condições na cláusula antes de ON
avaliar várias correspondências.
Exemplos
Você pode usar MERGE INTO
para operações complexas, como desduplicação de dados, atualização de dados de alteração, aplicação de operações SCD Tipo 2, etc. Consulte Upsert em uma tabela Delta Lake usando mesclagem para obter alguns exemplos.
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