Følgende eksempel bruger T-SQL til at flette to tabeller i SQL Server. Den bruger VALUES
tabelværdikonstruktør som kildetabellen.
Antag, at vi opretter en tabel som denne:
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;
Resultat:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
Og antag, at vi vil udføre en fusionsoperation. Vi vil gerne indsætte nye rækker, men hvis der allerede findes en række med værdier, der matcher dem i vores kilde, så vil vi i stedet opdatere den eksisterende række (i stedet for at indsætte en ny række).
Vi kan gøre det sådan her:
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;
Resultat:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
To nye rækker blev indsat og en blev opdateret.
Her brugte vi en tabelværdikonstruktør (VALUES
) for at angive de nye værdier for tabellen.
I dette tilfælde tjekkede vi IdiotId
og FirstName
kolonner. Grundlæggende, hvis ID og fornavn er det samme, så ønsker vi at opdatere den eksisterende række i stedet for at indsætte en ny.
Vi brugte WHEN MATCHED
for at angive, hvad der skal ske, når data fra vores VALUES
klausul matcher data i måltabellen. I dette tilfælde opdaterer vi blot rækken med de nye data fra VALUES
.
Vi brugte WHEN NOT MATCHED BY TARGET
for at specificere, hvad der skal ske, når der ikke er noget match. I dette tilfælde indsætter vi en ny række med de nye data.
Vi brugte også en variabel kaldet @Changes
for at se output fra vores fusionsoperation. Vi brugte OUTPUT
klausul efter fusionsoperationen for dette. Det var det, der gav os den resulterende tabel ovenfor.
Vi kan nu tjekke måltabellen for at se, hvilken effekt fusionsoperationen havde på den:
SELECT * FROM Idiots;
Resultat:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+
Vi kan se, at Idiot nummer 3 (Ned) har fået opdateret sit efternavn. Vi kan også se, at to nye idioter er blevet tilføjet til bordet (Lloyd og Harry).