
Resumen: en este tutorial, aprenderás a usar la sentencia MERGE de SQL Server para actualizar los datos en una tabla con los valores de otra tabla, puedes hacer insert, update y delete con esta sentencia.
Introducción sentencia MERGE de SQL Server
Supongamos que tienes dos tablas llamadas tablas origen y tabla destino, y necesita actualizar la tabla de destino en función de los valores coincidentes de la tabla de origen. Puede haber tres casos:
- La tabla de origen tiene algunas filas que no existen en la tabla de destino. En este caso, debes insertar filas que están en la tabla de origen en la tabla de destino.
- La tabla de destino tiene algunas filas que no existen en la tabla de origen. En este caso, debe eliminar filas de la tabla de destino.
- La tabla de origen tiene algunas filas con las mismas claves que las filas de la tabla de destino. Sin embargo, estas filas tienen valores diferentes en las columnas que no son clave. En este caso, debes actualizar las filas de la tabla de destino con los valores que provienen de la tabla de origen.
¿Cuándo usar MERGE?
La siguiente imagen ilustra las tablas de origen y de destino con las acciones correspondientes: insertar, actualizar y eliminar (INSERT, UPDATE y DELETE):
Si usas las declaraciones INSERT, UPDATE y DELETE individualmente, debes construir tres declaraciones separadas para actualizar los datos en la tabla de destino con las filas que coinciden de la tabla de origen.
Sin embargo, SQL Server proporciona la instrucción MERGE que te permite realizar tres acciones al mismo tiempo. A continuación se muestra la sintaxis de la instrucción MERGE:
Ejemplo MERGE
MERGE target_table USING source_table
ON merge_condition
WHEN MATCHED
THEN update_statement
WHEN NOT MATCHED
THEN insert_statement
WHEN NOT MATCHED BY SOURCE
THEN DELETE;
Primero, especifica la tabla de destino y la tabla de origen en la cláusula MERGE.
En segundo lugar, merge_condition determina cómo se comparan las filas de la tabla de origen con las filas de la tabla de destino. Es similar a la condición de unión en la cláusula JOIN. Por lo general, las columnas clave se utilizan como clave principal (primary key) o clave única (unique key) para la condición.
En tercer lugar, la merge_condition da como resultado tres estados: MATCHED, NOT MATCHED, y NOT MATCHED BY SOURCE.
- MATCHED: estas son las filas que coinciden con la condición de combinación. En el diagrama, se muestran en azul. Para las filas que coinciden, se debe actualizar las columnas de las filas en la tabla de destino con valores de la tabla de origen.
- NOT MATCHED: estas son las filas de la tabla de origen que no tienen filas que coinciden en la tabla de destino. En el diagrama, se muestran en naranja. En este caso, debe agregarse las filas de la tabla de origen a la tabla de destino. Ten en cuenta que NOT MATCHED también se conoce como NOT MATCHED BY TARGET.
- NOT MATCHED BY SOURCE: estas son las filas de la tabla de destino que no coinciden con ninguna fila de la tabla de origen. Se muestran en verde en el diagrama. Si deseas sincronizar la tabla de destino con los datos de la tabla de origen, deberás utilizar esta condición de coincidencia para eliminar filas de la tabla de destino.
Ejemplo de cómo usar la sentencia MERGE de SQL Server
Supongamos que tenemos dos tablas sales.category y sales.category_staging que almacenan las ventas por categoría de producto.
CREATE TABLE sales.category (
category_id INT PRIMARY KEY,
category_name VARCHAR(255) NOT NULL,
amount DECIMAL(10 , 2 )
);
INSERT INTO sales.category(category_id, category_name, amount)
VALUES(1,'Children Bicycles',15000),
(2,'Comfort Bicycles',25000),
(3,'Cruisers Bicycles',13000),
(4,'Cyclocross Bicycles',10000);
CREATE TABLE sales.category_staging (
category_id INT PRIMARY KEY,
category_name VARCHAR(255) NOT NULL,
amount DECIMAL(10 , 2 )
);
INSERT INTO sales.category_staging(category_id, category_name, amount)
VALUES(1,'Children Bicycles',15000),
(3,'Cruisers Bicycles',13000),
(4,'Cyclocross Bicycles',20000),
(5,'Electric Bikes',10000),
(6,'Mountain Bikes',10000);
Para actualizar los datos de sales.category (tabla de destino) con los valores de sales.category_staging (tabla de origen), utiliza la siguiente instrucción MERGE:
MERGE sales.category t
USING sales.category_staging s
ON (s.category_id = t.category_id)
WHEN MATCHED
THEN UPDATE SET
t.category_name = s.category_name,
t.amount = s.amount
WHEN NOT MATCHED BY TARGET
THEN INSERT (category_id, category_name, amount)
VALUES (s.category_id, s.category_name, s.amount)
WHEN NOT MATCHED BY SOURCE
THEN DELETE;
Resultado
En este ejemplo, usamos los valores en las columnas category_id en ambas tablas como condición de union.
- Primero, las filas con id 1, 3, 4 de la tabla sales.category_staging coinciden con las filas de la tabla de destino, por lo tanto, la declaración MERGE actualiza los valores en las columnas de nombre de categoría y cantidad en la tabla sales.category.
- En segundo lugar, las filas con ID 5 y 6 de la tabla sales.category_staging no existen en la tabla sales.category, por lo que la declaración MERGE inserta estas filas en la tabla de destino.
- Tercero, la fila con id 2 de la tabla sales.category no existe en la tabla sales.sales_staging, por lo tanto, la instrucción MERGE elimina esta fila.
Como resultado de la fusión con MERGE, los datos de la tabla sales.category están totalmente sincronizados con los datos de la tabla sales.category_staging.
En este tutorial, aprendiste a usar la instrucción MERGE de SQL Server para realizar cambios en una tabla en función de los valores coincidentes de otra tabla.