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