In het volgende voorbeeld wordt T-SQL gebruikt om twee tabellen in SQL Server samen te voegen. Het gebruikt de VALUES
tabelwaardeconstructor als de brontabel.
Stel dat we een tabel als volgt maken:
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;
Resultaat:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
En stel dat we een samenvoegbewerking willen uitvoeren. We willen nieuwe rijen invoegen, maar als er al een rij bestaat met waarden die overeenkomen met die in onze bron, dan willen we in plaats daarvan de bestaande rij bijwerken (in plaats van een nieuwe rij in te voegen).
We kunnen dat als volgt doen:
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;
Resultaat:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
Er zijn twee nieuwe rijen ingevoegd en één is bijgewerkt.
Hier hebben we een tabelwaardeconstructor gebruikt (VALUES
) om de nieuwe waarden voor de tabel op te geven.
In dit geval hebben we de IdiotId
. gecontroleerd en FirstName
kolommen. Kortom, als de ID en voornaam hetzelfde zijn, willen we de bestaande rij bijwerken in plaats van een nieuwe in te voegen.
We gebruikten WHEN MATCHED
om aan te geven wat er moet gebeuren als gegevens van onze VALUES
clausule komt overeen met gegevens in de doeltabel. In dit geval werken we de rij gewoon bij met de nieuwe gegevens van VALUES
.
We gebruikten WHEN NOT MATCHED BY TARGET
om aan te geven wat er moet gebeuren als er geen match is. In dit geval voegen we een nieuwe rij in met de nieuwe gegevens.
We gebruikten ook een variabele genaamd @Changes
om de uitvoer van onze samenvoegbewerking te bekijken. We gebruikten de OUTPUT
clausule na de samenvoegbewerking hiervoor. Dat is wat ons de resulterende tabel hierboven gaf.
We kunnen nu de doeltabel controleren om de impact te zien die de samenvoegbewerking erop had:
SELECT * FROM Idiots;
Resultaat:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+
We kunnen zien dat Idiot nummer 3 (Ned) zijn achternaam heeft bijgewerkt. We kunnen ook zien dat er twee nieuwe idioten aan de tafel zijn toegevoegd (Lloyd en Harry).