sql >> Base de Datos >  >> RDS >> Sqlserver

Ejemplo de una declaración de combinación simple en SQL Server

El siguiente ejemplo usa T-SQL para fusionar dos tablas en SQL Server. Utiliza los VALUES constructor de valores de tabla como tabla de origen.

Supongamos que creamos una tabla como esta:

CREATE TABLE Idiots (
    IdiotId int IDENTITY(1,1) NOT NULL,
    FirstName varchar(50),
    LastName varchar(50)
    );

INSERT INTO Idiots VALUES 
    ('Peter', 'Griffin'), 
    ('Homer', 'Simpson'), 
    ('Ned', 'Flanders');

SELECT * FROM Idiots;

Resultado:

+-----------+-------------+------------+
| IdiotId   | FirstName   | LastName   |
|-----------+-------------+------------|
| 1         | Peter       | Griffin    |
| 2         | Homer       | Simpson    |
| 3         | Ned         | Flanders   |
+-----------+-------------+------------+

Y supongamos que queremos realizar una operación de fusión. Queremos insertar nuevas filas, pero si ya existe una fila con valores que coinciden con los de nuestra fuente, entonces queremos actualizar la fila existente (en lugar de insertar una nueva fila).

Podemos hacerlo así:

DECLARE @Changes TABLE(Change VARCHAR(20));

MERGE INTO Idiots AS Target  
USING ( VALUES 
            (3, 'Ned', 'Okily Dokily!'), 
            (4, 'Lloyd','Christmas'), 
            (5, 'Harry', 'Dunne')
        ) AS Source ( IdiotId, FirstName, LastName )  
ON Target.IdiotId = Source.IdiotId
AND Target.FirstName = Source.FirstName
WHEN MATCHED THEN
    UPDATE SET FirstName = Source.FirstName, LastName = Source.LastName
WHEN NOT MATCHED BY TARGET THEN
    INSERT (FirstName, LastName) VALUES (Source.FirstName, Source.LastName)
OUTPUT $action INTO @Changes;

SELECT Change, COUNT(*) AS Count  
FROM @Changes  
GROUP BY Change;

Resultado:

+----------+---------+
| Change   | Count   |
|----------+---------|
| INSERT   | 2       |
| UPDATE   | 1       |
+----------+---------+

Se insertaron dos filas nuevas y se actualizó una.

Aquí, usamos un constructor de valores de tabla (VALUES ) para especificar los nuevos valores para la tabla.

En este caso revisamos el IdiotId y FirstName columnas Básicamente, si la ID y el nombre son iguales, queremos actualizar la fila existente en lugar de insertar una nueva.

Usamos WHEN MATCHED para especificar qué debe suceder cuando los datos de nuestros VALUES la cláusula coincide con los datos de la tabla de destino. En este caso, simplemente actualizamos la fila con los nuevos datos de VALUES .

Usamos WHEN NOT MATCHED BY TARGET para especificar lo que debería suceder cuando no hay coincidencia. En este caso insertamos una nueva fila con los nuevos datos.

También usamos una variable llamada @Changes para ver el resultado de nuestra operación de fusión. Usamos la OUTPUT cláusula después de la operación de fusión para esto. Eso es lo que nos dio la tabla resultante anterior.

Ahora podemos verificar la tabla de destino para ver el impacto que tuvo la operación de combinación:

SELECT * FROM Idiots;

Resultado:

+-----------+-------------+---------------+
| IdiotId   | FirstName   | LastName      |
|-----------+-------------+---------------|
| 1         | Peter       | Griffin       |
| 2         | Homer       | Simpson       |
| 3         | Ned         | Okily Dokily! |
| 4         | Lloyd       | Christmas     |
| 5         | Harry       | Dunne         |
+-----------+-------------+---------------+

Podemos ver que el idiota número 3 (Ned) ha actualizado su apellido. También podemos ver que se han añadido dos nuevos idiotas a la mesa (Lloyd y Harry).