Следният пример използва T-SQL за сливане на две таблици в SQL Server. Той използва VALUES
конструктор на стойност на таблицата като изходна таблица.
Да предположим, че създаваме таблица като тази:
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;
Резултат:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
И да предположим, че искаме да извършим операция на сливане. Искаме да вмъкнем нови редове, но ако вече съществува ред със стойности, които съвпадат с тези в нашия източник, тогава искаме да актуализираме съществуващия ред вместо това (вместо да вмъкваме нов ред).
Можем да направим това по следния начин:
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;
Резултат:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
Два нови реда бяха вмъкнати и един бе актуализиран.
Тук използвахме конструктор за стойности на таблица (VALUES
), за да посочите новите стойности за таблицата.
В този случай проверихме IdiotId
и FirstName
колони. По принцип, ако идентификационният номер и първото име са еднакви, тогава искаме да актуализираме съществуващия ред, вместо да вмъкваме нов.
Използвахме WHEN MATCHED
за да уточним какво трябва да се случи, когато данните от нашите VALUES
клауза съвпада с данни в целевата таблица. В този случай просто актуализираме реда с новите данни от VALUES
.
Използвахме WHEN NOT MATCHED BY TARGET
за да уточните какво трябва да се случи, когато няма съвпадение. В този случай вмъкваме нов ред с новите данни.
Използвахме и променлива, наречена @Changes
за да видите изхода от нашата операция за сливане. Използвахме OUTPUT
клауза след операцията за сливане за това. Това ни даде резултатната таблица по-горе.
Вече можем да проверим целевата таблица, за да видим въздействието, което операцията за сливане е оказала върху нея:
SELECT * FROM Idiots;
Резултат:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+
Можем да видим, че идиот номер 3 (Нед) е актуализирал фамилното си име. Можем също да видим, че към масата са добавени двама нови идиота (Лойд и Хари).