SQL

Cómo actualizar una tabla desde otra con MERGE de SQL Server

Estrada Web Group
jiestrada
Cómo actualizar una tabla desde otra con MERGE de SQL Server

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):

Ejemplo MERGE con INSERT DELTE UPDATE

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;

merge sql server

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.

 

Compartir artículo:

Más artículos geniales

¿Qué es el tipo de dato varchar de SQL Server y cuando utilizarlo?

¿Qué es el tipo de dato varchar de SQL Server y cuando utilizarlo?

En este tutorial, aprenderá a usar el tipo de datos VARCHAR de SQL Server para almacenar datos de cadena de longitud variable y no Unicode.

Ver artículo completo
Cómo agregar una o más columnas a una tabla en SQL con ALTER TABLE ADD

Cómo agregar una o más columnas a una tabla en SQL con ALTER TABLE ADD

Resumen: en este artículo, aprenderás a usar la instrucción ALTER TABLE ADD de SQL Server para agregar una o más columnas a una tabla.

Ver artículo completo
¿Cómo obtener una subcadena de una cadena de caracteres en SQL Server con la función Substring?

¿Cómo obtener una subcadena de una cadena de caracteres en SQL Server con la función Substring?

En este tutorial, aprenderá a usar la función SUBSTRING() de SQL Server para extraer una subcadena de una cadena.

Ver artículo completo

Manténgase actualizado

Obtenga excelente contenido en su bandeja de entrada todas las semanas.
Solo contenido excelente, no compartimos su correo electrónico con terceros.
Subir al inicio de la pantalla
;