MERGE INTO

Se aplica a:casilla marcada como Sí Databricks SQL casilla marcada como Sí Databricks Runtime

Combina un conjunto de actualizaciones, inserciones y eliminaciones basadas en una tabla de origen en una tabla Delta de destino.

Esta instrucción solo se admite para tablas de Delta Lake.

Esta página contiene detalles para usar la sintaxis correcta con el comando MERGE. Consulte Upsert en una tabla de Delta Lake mediante combinación para obtener más orientación sobre cómo utilizar operaciones MERGE para administrar sus datos.

Sintaxis

MERGE 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

  • target_table_name

    Nombre de tabla que identifica la tabla que se va a modificar. La tabla a la que se hace referencia debe ser una tabla Delta.

    La tabla no debe ser una tabla externa.

  • target_alias

    Alias de tabla para la tabla de destino. El alias no debe incluir una lista de columnas.

  • source_table_reference

    Nombre de tabla que identifica la tabla de origen que se va a combinar en la tabla de destino.

  • source_alias

    Alias de tabla de la tabla de origen. El alias no debe incluir una lista de columnas.

  • ON merge_condition

    Cómo se combinan las filas de una relación con las filas de otra relación. Expresión con un tipo de valor devuelto de BOOLEAN.

  • WHEN MATCHED [ AND matched_condition]

    Las cláusulas WHEN MATCHED se ejecutan cuando una fila de origen coincide con una fila de tabla de destino en función de merge_condition y match_condition opcional.

  • matched_action

    • DELETE

      Elimina la fila de la tabla de destino que coincide.

      Se permiten varias coincidencias cuando estas se eliminan de manera incondicional. Una eliminación incondicional no es ambigua, aunque existan varias coincidencias.

    • UPDATE

      Actualiza la fila de la tabla de destino que coincide.

      Para actualizar todas las columnas de la tabla Delta de destino con las columnas correspondientes del conjunto de datos de origen, use UPDATE SET *. Es equivalente a UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] para todas las columnas de la tabla Delta de destino. Por lo tanto, esta acción supone que la tabla de origen tiene las mismas columnas que las de la tabla de destino; de lo contrario, la consulta producirá un error de análisis.

      Nota:

      Este comportamiento cambia cuando se habilita la migración automática de esquemas. Consulte Evolución automática del esquema para la combinación de Delta Lake para más información.

      Se aplica a:casilla marcada como sí Databricks SQL casilla marcada como Sí Databricks Runtime 11.3 LTS y versiones posteriores

      Puede especificar DEFAULT como expr para actualizar explícitamente la columna a su valor predeterminado.

    Si hay varias cláusulas WHEN MATCHED, se evalúan en el orden en que se especifican. Todas las cláusulas WHEN MATCHED, excepto la última, deben tener matched_condition. De lo contrario, la consulta devuelve un error de NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION.

    Si ninguna de las condiciones WHEN MATCHED se evalúa como "true" para un par de filas de origen y destino que coincida con merge_condition, la fila de destino se dejará sin modificar.

  • WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition]

    Las cláusulas WHEN NOT MATCHED insertan una fila cuando una fila de origen no coincide con ninguna fila de destino basada en merge_condition y en not_matched_condition opcional.

    Se aplica a:casilla marcada como sí Databricks SQL casilla marcada como Sí Databricks Runtime 12.2 LTS y versiones posteriores

    WHEN NOT MATCHED BY TARGET se puede usar como alias de WHEN NOT MATCHED.

    not_matched_condition debe ser una expresión booleana.

    • INSERT *

      Inserta todas las columnas de la tabla Delta de destino con las columnas correspondientes del conjunto de datos de origen. Es equivalente a INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) para todas las columnas de la tabla Delta de destino. Esta acción necesita que la tabla de origen tenga las mismas columnas que las de la tabla de destino.

      Nota:

      Este comportamiento cambia cuando se habilita la migración automática de esquemas. Consulte Evolución automática del esquema para la combinación de Delta Lake para más información.

    • INSERT ( ... ) VALUES ( ... )

      La nueva fila se genera en función de la columna especificada y las expresiones correspondientes. No es necesario especificar todas las columnas de la tabla de destino. Para las columnas de destino que no están especificadas, se inserta la columna predeterminada o bien NULL si no existe ninguna.

      Se aplica a:casilla marcada como sí Databricks SQL casilla marcada como Sí Databricks Runtime 11.3 LTS y versiones posteriores

      Puede especificar DEFAULT como una expresión para insertar explícitamente la columna predeterminada para una columna de destino.

    Si hay varias cláusulas WHEN NOT MATCHED, se evalúan en el orden en que se especifican. Todas las cláusulas WHEN NOT MATCHED, excepto la última, deben tener not_matched_condition. De lo contrario, la consulta devuelve un error de NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION.

  • WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition]

    Se aplica a:casilla marcada como sí Databricks SQL casilla marcada como Sí Databricks Runtime 12.2 LTS y versiones posteriores

    Las cláusulas WHEN NOT MATCHED BY SOURCE se ejecutan cuando una fila de destino no coincide con ninguna fila de la tabla de origen en función de merge_condition y la not_match_by_source_condition opcional se evalúa como true.

    not_matched_by_source_condition debe ser una expresión booleana que solo haga referencia a columnas de la tabla de destino.

  • not_matched_by_source_action

    • DELETE

      Elimina la fila de la tabla de destino.

    • UPDATE

      Actualiza la fila de la tabla de destino. expr solo puede hacer referencia a columnas de la tabla de destino; de lo contrario, la consulta producirá un error de análisis.

      Se aplica a:casilla marcada como sí Databricks SQL casilla marcada como Sí Databricks Runtime 11.3 LTS y versiones posteriores

      Puede especificar DEFAULT como expr para actualizar explícitamente la columna a su valor predeterminado.

    Importante

    Agregar una cláusula WHEN NOT MATCHED BY SOURCE para actualizar o eliminar filas de destino cuando merge_condition se evalúa como false puede provocar una gran cantidad de filas de destino que se modifican. Para obtener el mejor rendimiento, aplique condiciones not_matched_by_source_condition para limitar el número de filas de destino actualizadas o eliminadas.

    Si hay varias WHEN NOT MATCHED BY SOURCE clauses, se evalúan en el orden en que se especifican. Todas las cláusulas WHEN NOT MATCHED BY SOURCE, excepto la última, deben tener not_matched_by_source_condition. De lo contrario, la consulta devuelve un error de NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION.

    Si ninguna de las condiciones WHEN NOT MATCHED BY SOURCE se evalúa como true para una fila de destino que no coincide con ninguna fila de la tabla de origen basada en merge_condition, la fila de destino se deja sin cambios.

Importante

Una operación MERGE puede producir el error DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE si varias filas del conjunto de datos de origen coinciden e intentan actualizar las mismas filas de la tabla Delta de destino. Según la semántica SQL de la fusión mediante combinación, esta operación de actualización es ambigua, ya que no está claro qué fila de origen se debe usar para actualizar la fila de destino coincidente. Puede procesar previamente la tabla de origen para eliminar la posibilidad de que haya varias coincidencias. Consulte el ejemplo de captura de datos modificados: procesa previamente el conjunto de datos de cambio (es decir, el conjunto de datos de origen) para conservar solo el cambio más reciente de cada clave antes de aplicar ese cambio en la tabla Delta de destino.

Ejemplos

Puede usar MERGE INTO en operaciones complejas, como la desduplicación de datos, upsert de datos de cambio, la aplicación de operaciones SCD de tipo 2, etc. Consulte Inserción en una tabla Data Lake mediante combinación para ver algunos ejemplos.

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