Contoh berikut menggunakan T-SQL untuk menggabungkan dua tabel di SQL Server. Ini menggunakan VALUES
konstruktor nilai tabel sebagai tabel sumber.
Misalkan kita membuat tabel seperti ini:
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;
Hasil:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
Dan misalkan kita ingin melakukan operasi penggabungan. Kami ingin menyisipkan baris baru, tetapi jika baris sudah ada dengan nilai yang cocok dengan yang ada di sumber kami, maka kami ingin memperbarui baris yang ada sebagai gantinya (alih-alih menyisipkan baris baru).
Kita bisa melakukannya seperti ini:
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;
Hasil:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
Dua baris baru dimasukkan dan satu telah diperbarui.
Di sini, kami menggunakan konstruktor nilai tabel (VALUES
) untuk menentukan nilai baru untuk tabel.
Dalam hal ini kami memeriksa IdiotId
dan FirstName
kolom. Pada dasarnya, jika ID dan nama depan sama, maka kami ingin memperbarui baris yang ada daripada memasukkan yang baru.
Kami menggunakan WHEN MATCHED
untuk menentukan apa yang harus terjadi ketika data dari VALUES
. kami klausa cocok dengan data dalam tabel target. Dalam hal ini, kami cukup memperbarui baris dengan data baru dari VALUES
.
Kami menggunakan WHEN NOT MATCHED BY TARGET
untuk menentukan apa yang harus terjadi ketika tidak ada kecocokan. Dalam hal ini kami menyisipkan baris baru dengan data baru.
Kami juga menggunakan variabel yang disebut @Changes
untuk melihat output dari operasi penggabungan kami. Kami menggunakan OUTPUT
klausa setelah operasi penggabungan untuk ini. Itulah yang memberi kami tabel yang dihasilkan di atas.
Sekarang kita dapat memeriksa tabel target untuk melihat dampak operasi penggabungan terhadapnya:
SELECT * FROM Idiots;
Hasil:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+
Kita dapat melihat bahwa Idiot nomor 3 (Ned) telah memperbarui nama belakangnya. Kita juga dapat melihat bahwa dua idiot baru telah ditambahkan ke meja (Lloyd dan Harry).