Volver a la página principal
lunes 18 noviembre 2024
10

Cómo combinar datos con MERGE en SQL Server

El comando MERGE en SQL Server permite realizar operaciones de inserción, actualización o eliminación en una tabla de destino en función de los datos de una tabla de origen. Es especialmente útil para sincronizar datos en procesos ETL o de mantenimiento de bases de datos.

¿Qué es MERGE en SQL Server?

MERGE combina la lógica de INSERT, UPDATE y DELETE en una sola sentencia, comparando registros entre una tabla de origen y una tabla de destino mediante una condición de coincidencia (ON). Según el resultado de esta comparación, ejecuta acciones específicas.

Sintaxis de MERGE

MERGE INTO <tabla_destino> AS destino
USING <tabla_origen> AS origen
ON <condición_de_unión>
WHEN MATCHED THEN
    <acción_si_coinciden>
WHEN NOT MATCHED [BY TARGET] THEN
    <acción_si_faltan_en_destino>
WHEN NOT MATCHED BY SOURCE THEN
    <acción_si_faltan_en_origen>
[OUTPUT <cláusula_output>];

Elementos principales

Elemento Descripción
tabla_destino Tabla donde se aplicarán las operaciones (inserción, actualización o eliminación).
tabla_origen Conjunto de datos que se compara contra la tabla de destino.
WHEN MATCHED Acción a realizar si un registro en origen coincide con uno en destino.
WHEN NOT MATCHED Acción a realizar si un registro en origen no tiene coincidencia en destino.
WHEN NOT MATCHED BY SOURCE Acción a realizar si un registro en destino no tiene coincidencia en origen.

Ejemplos de uso

1. Insertar o actualizar registros

MERGE INTO productos AS destino
USING (SELECT id, nombre, precio FROM productos_nuevos) AS origen
ON destino.id = origen.id
WHEN MATCHED THEN
    UPDATE SET destino.nombre = origen.nombre, destino.precio = origen.precio
WHEN NOT MATCHED THEN
    INSERT (id, nombre, precio) VALUES (origen.id, origen.nombre, origen.precio);

En este caso:

  • Si el registro existe en ambas tablas, se actualiza.
  • Si no existe en destino, se inserta.

2. Eliminar registros que no están en el origen

MERGE INTO productos AS destino
USING (SELECT id FROM productos_actualizados) AS origen
ON destino.id = origen.id
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

Este comando elimina registros en la tabla de destino que no están presentes en la tabla de origen.

3. Registrar las operaciones realizadas

MERGE INTO productos AS destino
USING (SELECT id, nombre, precio FROM productos_nuevos) AS origen
ON destino.id = origen.id
WHEN MATCHED THEN
    UPDATE SET destino.nombre = origen.nombre, destino.precio = origen.precio
WHEN NOT MATCHED THEN
    INSERT (id, nombre, precio) VALUES (origen.id, origen.nombre, origen.precio)
OUTPUT $action, inserted.*, deleted.*;

El uso de OUTPUT permite registrar las operaciones realizadas (INSERT, UPDATE, DELETE) junto con los datos afectados.

Buenas prácticas al usar MERGE

1. Prueba con transacciones: Usa transacciones para evitar cambios no deseados en los datos.

2. Evita condiciones ambiguas: Asegúrate de que la condición en ON sea específica y no genere múltiples coincidencias.

3. Controla los conflictos: Usa la cláusula WHEN MATCHED AND para limitar qué registros se deben actualizar.

Referencias oficiales

Consulta la documentación oficial de SQL Server sobre MERGE para obtener más información.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer