Partilhar via


MERGE INTO

Aplica-se a: Marque Sim Databricks SQL Marque Sim 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: Marque Sim 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.

  • target_table_name

    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.

  • target_alias

    Um alias de tabela para a tabela de destino. O alias não deve incluir uma lista de colunas.

  • source_table_reference

    Um nome de tabela que identifica a tabela de origem a ser mesclada na tabela de destino.

  • source_alias

    Um alias de tabela para a tabela de origem. O alias não deve incluir uma lista de colunas.

  • EM merge_condition

    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 no merge_condition e no opcional match_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 a UPDATE 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: Marque Sim Databricks SQL Marque Sim Databricks Runtime 11.3 LTS e superior

      Você pode especificar DEFAULT como expr 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. Cada WHEN MATCHED cláusula, exceto a última, deve ter um matched_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 ao merge_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 no merge_condition e no opcional not_matched_condition.

    Aplica-se a: Marque Sim Databricks SQL Marque Sim Databricks Runtime 12.2 LTS e superior

    WHEN NOT MATCHED BY TARGET pode ser usado como um alias para WHEN 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: Marque Sim Databricks SQL Marque Sim 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 as WHEN NOT MATCHED cláusulas, exceto a última, devem ter not_matched_conditions. 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: Marque Sim Databricks SQL Marque Sim 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 o merge_condition opcional not_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: Marque Sim Databricks SQL Marque Sim Databricks Runtime 11.3 LTS e superior

      Você pode especificar DEFAULT como expr 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 a merge_condition avaliação é falsa pode levar à modificação de um grande número de linhas de destino. Para obter o melhor desempenho, aplique not_matched_by_source_conditions 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. Cada WHEN NOT MATCHED BY SOURCE cláusula, exceto a última, deve ter um not_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 no merge_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