Merge adalah sebuah T-SQL Statement baru yang terdapat pada SQL Server 2008 yang digunakan untuk melakukan proses sinkronisasi antara dua buah table. Idenya seperti ini: satu table digunakan sebagai source dan table lainnya sebagai target. Dengan Merge, kita dapat melakukan sinkronisasi sehingga data yang terdapat pada target akan sama dengan yang terdapat pada source.
Contoh syntax sederhana Merge seperti ini:
MERGE
<table_target>
USING <table_source>
ON <merge_search_condition>
[ WHEN MATCHED [ AND <clause_search_condition> ]
THEN <merge_matched> ]
[ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
THEN <merge_not_matched> ]
[ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
THEN <merge_matched> ]
; |
Keterangan:
<table_target> | table yang dijadikan target sinkronisasi |
<table_source> | table yang dijadikan source sinkronisasi |
<merge_search_condition> | kondisi join antara <table_target> dan <table_source> |
WHEN MATCHED | kondisi pada saat row di <table_target> sama dengan <table_source> berdasarkan kondisi <merge_search_condition> |
WHEN NOT MATCHED [BY TARGET] | kondisi pada saat row di <source_table> tidak terdapat di <target_table> |
WHEN NOT MATCHED BY SOURCE | kondisi pada saat row di <target_table> tidak terdapat di <source_table> |
Pada contoh berikut, saya akan membuat dua buah table yang diberi nama @oldtable dan @newtable dan berisi code dan quantity lalu melakukan merge sehingga data pada @oldtable menjadi sinkron dengan yang terdapat di @new table.
--deklarasi
declare @oldtable as
table (code varchar(10), quantity int)
declare @newtable as
table (code varchar(10), quantity int)
--insert data
insert @oldtable values ('prod1',100),
('prod2',200)
insert @newtable values ('prod1',500),
('prod3',300)
--merge data
merge @oldtable a
using @newtable b
on a.code = b.code
when
not
matched
then
insert (code, quantity)
values (b.code, b.quantity)
when
matched
and a.quantity <> b.quantity then
update
set a.quantity = b.quantity
when
not
matched
by
source
then
delete
output
$action, inserted.code, inserted.quantity, deleted.code, deleted.quantity
; |
Apabila kita execute, akan terlihat row mana saja yang di-insert, update, dan delete.