Mssql Merge Kullanımı
Mssql 14 Mayıs, 2020

SQL Server 2008 versiyonuyla gelen bir özellik olan Merge iki farklı tabloyu (kaynak ve hedef) senkronize etme konusunda oldukça kullanışlı bir komut olarak gelmiş durumda. Senkronizeden kasıt bazen elimizde bir veri seti (tablo) olur ve bu verilerle başka tabloda işlemler yapmamız gerekir. Örneğin elimizdeki veri setinde olup diğer tabloda olmayan kayıtları eklemek, her iki tabloda olan kayıtları veri setine göre güncellemek ve veri setinde olmayıp diğer tabloda olan kayıtları silmek gerekir. Merge ile tek seferde bu iki tabloyu ortak kolon(lar) üzerinden karşılaştırıp hedef tabloyu güncel tutabiliyoruz. Bu işlemi Merge kullanmak yapmaya kalksak satırlar dolusu sql kodu yazmak gerekirdi.

Uygulamaya geçecek olursak öncelikle aşağıdaki gibi 2 adet tablomuz olsun. Book_Source güncel verilerin olduğu tablo, Book_Target ise güncellemek istediğimiz tablo olsun.

CREATE TABLE Book_Source
(
   BookId INT PRIMARY KEY,
   BookName VARCHAR(100),
   Amount MONEY
) 

CREATE TABLE Book_Target
(
   BookId INT PRIMARY KEY,
   BookName VARCHAR(100),
   Amount MONEY
) 

Bu tablolara aşağıdaki veriler girilmiş olsun.

INSERT INTO Book_Source
VALUES
(1,'The Great Gatsby', 20.00),
(2,'Hamlet', 50.00),
(4,'Pride and Prejudice', 35.00)
   
INSERT INTO Book_Target
VALUES
(1,'The Great Gatsby', 10.00),
(2,'Hamlet', 25.00),
(3,'The Picture of Dorian Gray', 35.00)

Bu iki tabloyu BookId kolonu üzerinden senkronize eden Merge komutumuz şöyledir:

MERGE Book_Target TARGET 
    USING Book_SOURCE SOURCE  
ON (SOURCE.BookId = TARGET.BookId)  
WHEN MATCHED THEN                     
    UPDATE SET                 
       TARGET.BookName = SOURCE.BookName,
       TARGET.Amount = SOURCE.Amount
WHEN NOT MATCHED BY TARGET THEN     
    INSERT (BookId, BookName, Amount)
       VALUES (SOURCE.BookId, SOURCE.BookName, SOURCE.Amount)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

Burada yapılan işlemleri açıklayacak olursak:

  • WHEN MATCHED THEN: Kaynak ve hedef tablolarda kayıtların eşleşmesi durumunda yapılacak işlemler belirtilir, yani hedef tablodaki kayıtlar güncellenir.
  • WHEN NOT MATCHED BY TARGET THEN: Kaynak tabloda olup hedef tabloda olmayan kayıtlar insert edilir.
  • WHEN NOT MATCHED BY SOURCE THEN: Kaynak tabloda olmayıp hedef tabloda olan kayıtlar silinir. 

Dikkat edilmesi gereken bir nokta ise Merge komutunda işlemler sadece hedef tablo üzerinde yürütülür.

Burada Merge işleminden önce Book_Target tablosundaki kayıtları görüyorsunuz:

Burada ise Merge işleminden sonra Book_Target tablosundaki kayıtların durumunu görüyorsunuz:

Dikkat ettiyseniz Book_Target tablosundaki 1 ve 2 numaralı kaydın Amount bilgisi güncellendi. 3 numaralı kayıt silindi ve 4 numaralı kayıt eklendi.

Bu işlemleri manuel yaptığınızı düşünün, onlarca satır kod yazmanız gerekirdi ancak Merge ile hepsi bu kadar basit.

Performans konusuna gelince kaynak ve hedef tabloları eşleştirdiğimiz kolonlar üzerinde index kurulması performansı olumlu etkileyecektir. 

Referans: https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15

Kodlamaya devam!


Yorumlar

Mssql Merge Kullanımı
Mssql 14 Mayıs, 2020

SQL Server 2008 versiyonuyla gelen bir özellik olan Merge iki farklı tabloyu (kaynak ve hedef) senkronize etme konusunda oldukça kullanışlı bir komut olarak gelmiş durumda. Senkronizeden kasıt bazen elimizde bir veri seti (tablo) olur ve bu verilerle başka tabloda işlemler yapmamız gerekir. Örneğin elimizdeki veri setinde olup diğer tabloda olmayan kayıtları eklemek, her iki tabloda olan kayıtları veri setine göre güncellemek ve veri setinde olmayıp diğer tabloda olan kayıtları silmek gerekir. Merge ile tek seferde bu iki tabloyu ortak kolon(lar) üzerinden karşılaştırıp hedef tabloyu güncel tutabiliyoruz. Bu işlemi Merge kullanmak yapmaya kalksak satırlar dolusu sql kodu yazmak gerekirdi.

Uygulamaya geçecek olursak öncelikle aşağıdaki gibi 2 adet tablomuz olsun. Book_Source güncel verilerin olduğu tablo, Book_Target ise güncellemek istediğimiz tablo olsun.

CREATE TABLE Book_Source
(
   BookId INT PRIMARY KEY,
   BookName VARCHAR(100),
   Amount MONEY
) 

CREATE TABLE Book_Target
(
   BookId INT PRIMARY KEY,
   BookName VARCHAR(100),
   Amount MONEY
) 

Bu tablolara aşağıdaki veriler girilmiş olsun.

INSERT INTO Book_Source
VALUES
(1,'The Great Gatsby', 20.00),
(2,'Hamlet', 50.00),
(4,'Pride and Prejudice', 35.00)
   
INSERT INTO Book_Target
VALUES
(1,'The Great Gatsby', 10.00),
(2,'Hamlet', 25.00),
(3,'The Picture of Dorian Gray', 35.00)

Bu iki tabloyu BookId kolonu üzerinden senkronize eden Merge komutumuz şöyledir:

MERGE Book_Target TARGET 
    USING Book_SOURCE SOURCE  
ON (SOURCE.BookId = TARGET.BookId)  
WHEN MATCHED THEN                     
    UPDATE SET                 
       TARGET.BookName = SOURCE.BookName,
       TARGET.Amount = SOURCE.Amount
WHEN NOT MATCHED BY TARGET THEN     
    INSERT (BookId, BookName, Amount)
       VALUES (SOURCE.BookId, SOURCE.BookName, SOURCE.Amount)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

Burada yapılan işlemleri açıklayacak olursak:

  • WHEN MATCHED THEN: Kaynak ve hedef tablolarda kayıtların eşleşmesi durumunda yapılacak işlemler belirtilir, yani hedef tablodaki kayıtlar güncellenir.
  • WHEN NOT MATCHED BY TARGET THEN: Kaynak tabloda olup hedef tabloda olmayan kayıtlar insert edilir.
  • WHEN NOT MATCHED BY SOURCE THEN: Kaynak tabloda olmayıp hedef tabloda olan kayıtlar silinir. 

Dikkat edilmesi gereken bir nokta ise Merge komutunda işlemler sadece hedef tablo üzerinde yürütülür.

Burada Merge işleminden önce Book_Target tablosundaki kayıtları görüyorsunuz:

Burada ise Merge işleminden sonra Book_Target tablosundaki kayıtların durumunu görüyorsunuz:

Dikkat ettiyseniz Book_Target tablosundaki 1 ve 2 numaralı kaydın Amount bilgisi güncellendi. 3 numaralı kayıt silindi ve 4 numaralı kayıt eklendi.

Bu işlemleri manuel yaptığınızı düşünün, onlarca satır kod yazmanız gerekirdi ancak Merge ile hepsi bu kadar basit.

Performans konusuna gelince kaynak ve hedef tabloları eşleştirdiğimiz kolonlar üzerinde index kurulması performansı olumlu etkileyecektir. 

Referans: https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15

Kodlamaya devam!


Yorumlar