SQLSql ServerT-SQL

Sql Server Merge Nedir ? Nasıl Kullanılır ?

Sql Serverda merge komutu iki tablo arasındaki farklı gördüğü alanı insert edip aynı gördüğü alanı  güncelleyip , farklı alanı ise silebileceğimiz bir yapı oluşturur. İki tablo arası eşitleme gibide düşünebiliriz. Eğer kayıt var ise güncelle yok ise ekle mantığıyla çalışmaktadır. Bu gibi durumlarla karşılaşırız ya merge komutu yada [if else] ile kontrolünü yapıp yoksa insert et varsa güncelle gibi queryler yazmışsınızdır.

Kullanım şekli şu şekildedir ;

 

MERGE <target_table> [AS TARGET]

USING <table_source> [AS SOURCE]

ON <search_condition>

[WHEN MATCHED

THEN <merge_matched> ]

[WHEN NOT MATCHED [BY TARGET]

THEN <merge_not_matched> ]

[WHEN NOT MATCHED BY SOURCE

 

Bu işlemi örnek ile detaylandırmak gerekir ise ;

Bu işlem için 2 adet tablomuz olacaktır , Kaynak tablo ve hedef tablo ;

CREATE TABLE Uyeler_Target
(
UyeID INT PRIMARY KEY,
UyeName VARCHAR(100)
)

INSERT INTO Uyeler_Target
VALUES
(1, 'Semih'),
(2, 'Ahmet'),
(3, 'Mehmet')

CREATE TABLE Uyeler_Source
(
UyeID INT PRIMARY KEY,
UyeName VARCHAR(100)
)

INSERT INTO Uyeler_Source
VALUES
(1, 'Masal'),
(2, 'Funda'),
(5, 'Selami')

Bu tablolarımızda fark ettiyseniz aynı ID ye sahip üyeler ve farklı ID’ye sahip üyeler bulunmakta select ile çektiğimizde tablolarımızın son hali aşağıdaki gibidir

Şimdi merge işlemiyle hedef tablomuzu kaynak talomuza göre optimize et , olmayan verileri insert et aynı ID’ye sahip verileri update et, hiç bulamadığın verileride sil diyeceğiz.

MERGE Uyeler_Target AS TARGET
USING Uyeler_Source AS SOURCE 
ON (TARGET.UyeID = SOURCE.UyeID)

WHEN MATCHED AND TARGET.UyeName <> SOURCE.UyeName
THEN UPDATE SET TARGET.UyeName = SOURCE.UyeName

WHEN NOT MATCHED BY TARGET 
THEN INSERT (UyeID, UyeName) VALUES (SOURCE.UyeID, SOURCE.UyeName)

WHEN NOT MATCHED BY SOURCE 
THEN DELETE

OUTPUT $action, 
DELETED.UyeID AS TargetUyeID, 
DELETED.UyeName AS TargetUyeName,

INSERTED.UyeID AS SourceUyeID, 
INSERTED.UyeName AS SourceUyeName;

SELECT @@ROWCOUNT;

Bu işlemin çıktısı ise aşağıdaki gibidir ;

çıkan sonuçta göreceğiniz üzere aynı ID olan kayıtların isimlerini güncelledi bulamadığı kaydı insert etti , hedefte olupta kaynakta olmayan kaydı ise sildi , burada eğer delete işlemi yaptırmak istemez iseniz o bloğu kaldırabilirsiniz, en son tablomuzun son halini çektiğimizde ise çıkan sonuç aşağıdaki gibidir.

Paylaş

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir