MERGE INTO
Se aplica a: Databricks SQL 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 [ 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
Se aplica a Databricks Runtime 15.2 y versiones posteriores
Habilita evolución automática del esquema para esta operación de
MERGE
. Cuando se habilita, el esquema de la tabla Delta de destino se actualiza automáticamente para que coincida con el esquema de la tabla de origen.-
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.
-
Un alias de tabla para la tabla de destino. El alias no debe incluir una lista de columnas.
-
Nombre de tabla que identifica la tabla de origen que se va a combinar en la tabla de destino.
-
Alias de tabla de la tabla de origen. El alias no debe incluir una lista de columnas.
-
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 demerge_condition
ymatch_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 aUPDATE 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 evolució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 Databricks SQL Databricks Runtime 11.3 LTS y versiones posteriores
Puede especificar
DEFAULT
comoexpr
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áusulasWHEN MATCHED
, excepto la última, deben tenermatched_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 conmerge_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 enmerge_condition
y ennot_matched_condition
opcional.Se aplica a Databricks SQL Databricks Runtime 12.2 LTS y versiones posteriores
WHEN NOT MATCHED BY TARGET
se puede usar como alias deWHEN 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 evolució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 Databricks SQL 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áusulasWHEN NOT MATCHED
, excepto la última, deben tenernot_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 Databricks SQL 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 demerge_condition
y lanot_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 Databricks SQL Databricks Runtime 11.3 LTS y versiones posteriores
Puede especificar
DEFAULT
comoexpr
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 cuandomerge_condition
se evalúa como false puede provocar una gran cantidad de filas de destino que se modifican. Para obtener el mejor rendimiento, aplique condicionesnot_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áusulasWHEN NOT MATCHED BY SOURCE
, excepto la última, deben tenernot_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 enmerge_condition
, la fila de destino se deja sin cambios.
Importante
MERGE
las operaciones producen un error de DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE si más de una fila de la tabla de origen coincide con la misma fila de la tabla de destino en función de las condiciones especificadas en las ON
cláusulas y WHEN MATCHED
. Según la semántica de SQL de combinación, este tipo de operación de actualización es ambiguo porque 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. En este ejemplo se preprocesa el conjunto de datos de cambios (el conjunto de datos de origen) para conservar solo el cambio más reciente para cada clave antes de aplicar ese cambio a la tabla Delta de destino. En Databricks Runtime 15.4 LTS y versiones posteriores, MERGE
solo tiene en cuenta las condiciones de la ON
cláusula antes de evaluar varias coincidencias.
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
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