Následující příklad používá T-SQL ke sloučení dvou tabulek v SQL Server. Používá VALUES
konstruktor hodnoty tabulky jako zdrojovou tabulku.
Předpokládejme, že vytvoříme tabulku takto:
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;
Výsledek:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
A předpokládejme, že chceme provést operaci sloučení. Chceme vložit nové řádky, ale pokud již existuje řádek s hodnotami, které odpovídají hodnotám v našem zdroji, pak chceme místo toho aktualizovat stávající řádek (místo vkládání nového řádku).
Můžeme to udělat takto:
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;
Výsledek:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
Byly vloženy dva nové řádky a jeden byl aktualizován.
Zde jsme použili konstruktor hodnot tabulky (VALUES
), chcete-li zadat nové hodnoty pro tabulku.
V tomto případě jsme zkontrolovali IdiotId
a FirstName
sloupců. V zásadě, pokud jsou ID a jméno stejné, chceme aktualizovat stávající řádek namísto vkládání nového.
Použili jsme WHEN MATCHED
specifikovat, co se má stát, když data z našich VALUES
klauzule odpovídá datům v cílové tabulce. V tomto případě jednoduše aktualizujeme řádek novými daty z VALUES
.
Použili jsme WHEN NOT MATCHED BY TARGET
specifikovat, co se má stát, když nedojde k žádné shodě. V tomto případě vložíme nový řádek s novými daty.
Také jsme použili proměnnou nazvanou @Changes
k zobrazení výstupu naší operace sloučení. Použili jsme OUTPUT
klauzule po operaci sloučení za tímto účelem. To je to, co nám poskytlo výslednou tabulku výše.
Nyní můžeme zkontrolovat cílovou tabulku, abychom viděli dopad, který na ni měla operace sloučení:
SELECT * FROM Idiots;
Výsledek:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+
Vidíme, že Idiot číslo 3 (Ned) aktualizoval své příjmení. Můžeme také vidět, že do stolu byli přidáni dva noví idioti (Lloyd a Harry).