Salah satu fitur baru di SQL Server 2008 dalam T-SQL adalah ‘Merge Statement’. Merge Statement memungkinkan programmer melakukan statement insert, update dan delete dalam 1 buah statement.
Cara klasik yang biasa digunakan untuk bisa melakukan sebuah proses insert, update dan delete dalam satu statement adalah dengan cara membuat sebuah store procedure. Pekerjaan ini sekarang dapat digantikan dengan melakukan T-SQL biasa, yaitu menggunakan Merge Statement.
Merge Statement ini memerlukan sebuah source table/view sebagai acuan untuk melakukan operasi insert, update, delete pada tabel/view target. kedua table/view tersebut harus memiliki sebuah relational melalui Join Condition.
Saya akan coba berikan sebuah ilustrasi agar dapat memahami Merge Statement.
saya menyiapkan sebuah tabel Purchases yang berisi pencatatan pembelian oleh customer pada satu atau beberapa produk yang terjadi minggu Ini.
USE AdventureWorks; GO IF OBJECT_ID (N'dbo.Purchases', N'U') IS NOT NULL DROP TABLE dbo.Purchases; GO CREATE TABLE dbo.Purchases ( ProductID int, CustomerID int, PurchaseDate datetime, CONSTRAINT PK_PurchProdID PRIMARY KEY(ProductID,CustomerID)); GO INSERT INTO dbo.Purchases VALUES(707, 11794, '20060821'), (707, 15160, '20060825'),(708, 18529, '20060821'), (711, 11794, '20060821'),(711, 19585, '20060822'), (712, 14680, '20060825'),(712, 21524, '20060825'), (712, 19072, '20060821'),(870, 15160, '20060823'), (870, 11927, '20060824'),(870, 18749, '20060825'); GO
Kemudian didalam sebuah datawarehouse, ada sebuah tabel FactBuyingHabits yang memiliki fungsi merekam tanggal pembelian terakhir yang dilakukan oleh customer pada spesific product. Update data terakhir tabel FactBuyingHabits adalah minggu lalu. Tabel FactBuyingHabits dalam kasus ini kita jadikan sebagai tabel target.
Berikut ini adalah T-SQL untuk membuat tabel FactBuyingHabits
USE AdventureWorks; GO IF OBJECT_ID (N'dbo.FactBuyingHabits', N'U') IS NOT NULL DROP TABLE dbo.FactBuyingHabits; GO CREATE TABLE dbo.FactBuyingHabits ( ProductID int, CustomerID int, LastPurchaseDate datetime, CONSTRAINT PK_FactProdID PRIMARY KEY(ProductID,CustomerID)); GO INSERT INTO dbo.FactBuyingHabits VALUES(707, 11794, '20060814'), (707, 18178, '20060818'),(864, 14114, '20060818'), (866, 13350, '20060818'),(866, 20201, '20060815'), (867, 20201, '20060814'),(869, 19893, '20060815'), (870, 17151, '20060818'),(870, 15160, '20060817'), (871, 21717, '20060817'),(871, 21163, '20060815'), (871, 13350, '20060815'),(873, 23381, '20060815'); GO
MERGE dbo.FactBuyingHabits AS Target USING (SELECT CustomerID, ProductID, PurchaseDate FROM dbo.Purchases) AS Source ON (Target.ProductID = Source.ProductID AND Target.CustomerID = Source.CustomerID) WHEN MATCHED THEN UPDATE SET Target.LastPurchaseDate = Source.PurchaseDate WHEN NOT MATCHED BY TARGET THEN INSERT (CustomerID, ProductID, LastPurchaseDate) VALUES (Source.CustomerID, Source.ProductID, Source.PurchaseDate) OUTPUT $action, Inserted.*, Deleted.*;
Makasih banget ya pak. Benar-benar membantu. Saya agak bingung katika baca sumber yg bahasa inggris 🙂
Ok, sama2, semoga bermanfaat
Mas izin bertanya, saya baru menggunakan sql server
sintaks ini, maksudnya untuk apa yaa ?
IF OBJECT_ID (N’dbo.Purchases’, N’U’) IS NOT NULL
DROP TABLE dbo.Purchases;