Merge Statement in SQL Server 2008

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
tabel purchases ini adalah sebagai source.

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

Bila kita perhatikan, didalam tabel purchases, customer no 11794 membeli sebuah product berkode 707, kejadian ini memiliki kesamaan dengan transaksi yang terjadi minggu lalu yang tercatat di tabel FactBuyingHabits . dalam hal ini, proses yang terjadi adalah proses update. data dari tabel Purchases akan mengupdate tabel FactBuyingHabits untuk customer no 11794 yang membeli sebuah product berkode 707. hal yang juga terjadi pada customer no 15160 yang membeli sebuah product berkode 870.
Sedangkan data yang lain pada tabel Purchases akan dilakukan proses insert ke tabel FactBuyingHabits .
Ilustrasi diatas dapat diselesaikan dengan menggunakan Merge Statement. sehingga dengan sebuah statement saja, kita dapat melakukan proses update dan insert.
Berikut ini adalah T-SQL nya :
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.*;
Simple bukan 😉
Selamat mencoba.

Leave a Reply