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.