Poniższy przykład używa T-SQL do scalania dwóch tabel w SQL Server. Używa VALUES
Konstruktor wartości tabeli jako tabela źródłowa.
Załóżmy, że tworzymy taką tabelę:
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;
Wynik:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
I załóżmy, że chcemy wykonać operację scalania. Chcemy wstawić nowe wiersze, ale jeśli wiersz już istnieje z wartościami pasującymi do tych w naszym źródle, zamiast tego chcemy zaktualizować istniejący wiersz (zamiast wstawiać nowy wiersz).
Możemy to zrobić w ten sposób:
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;
Wynik:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
Wstawiono dwa nowe wiersze, a jeden zaktualizowano.
Tutaj użyliśmy konstruktora wartości tabeli (VALUES
), aby określić nowe wartości dla tabeli.
W tym przypadku sprawdziliśmy IdiotId
i FirstName
kolumny. Zasadniczo, jeśli identyfikator i imię są takie same, chcemy zaktualizować istniejący wiersz zamiast wstawiać nowy.
Użyliśmy WHEN MATCHED
aby określić, co powinno się stać, gdy dane z naszych VALUES
klauzula pasuje do danych w tabeli docelowej. W takim przypadku po prostu aktualizujemy wiersz o nowe dane z VALUES
.
Użyliśmy WHEN NOT MATCHED BY TARGET
aby określić, co powinno się stać, gdy nie ma dopasowania. W tym przypadku wstawiamy nowy wiersz z nowymi danymi.
Użyliśmy również zmiennej o nazwie @Changes
aby wyświetlić wyniki naszej operacji łączenia. Użyliśmy OUTPUT
klauzula po operacji łączenia dla tego. To właśnie dało nam wynikową tabelę powyżej.
Możemy teraz sprawdzić tabelę docelową, aby zobaczyć wpływ, jaki miała na nią operacja scalania:
SELECT * FROM Idiots;
Wynik:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+
Widzimy, że Idiot numer 3 (Ned) otrzymał zaktualizowane nazwisko. Widzimy również, że do stołu dodano dwóch nowych idiotów (Lloyd i Harry).