SQL Server’da Upsert Nasıl Yapılır: Insert ve Update İşlemlerinin Birleştirilmesi

Veritabanlarıyla çalışırken, mevcut olan veya olmayan kayıtları yönetmemiz gereken durumlarla sık sık karşılaşırız. İşte burada Upsert kavramı devreye girer; bu kavram INSERT ve UPDATE işlemlerini sorunsuz bir şekilde birleştirmemizi sağlar. Bu blog yazısında, yaygın bir SQL Server sorununu ele alacak ve Upsert mantığını etkili bir şekilde uygulayan bir çözüm sunacağız.

Problem: İş Atamaları Yönetimi

Diyelim ki, her işin atandığı kişiyi ve mevcut aşamasını gösteren bir iş atamaları görünümünüz var. Amacınız, farklı aşamalardaki her personel için iş sayısını döndüren bir saklı prosedür oluşturmaktır.

İlk deneme, sayıları geçici bir tabloya eklemeyi içerir. Ancak, bir anahtar sorun; aynı işte birden fazla aşamaya sahip olan personel üyelerinin sonuç tablonuzda ayrı satırlar oluşturmasıdır. Bunun yerine, bir personel üyesinin mevcut bir satırını güncelleyen veya hiç yoksa yeni bir satır ekleyen bir yönteme ihtiyacınız var.

Başladığınız kodun basitleştirilmiş bir örneği şöyle:

DECLARE @ResultTable table 
(
  StaffName nvarchar(100),
  Stage1Count int,
  Stage2Count int
)

INSERT INTO @ResultTable (StaffName, Stage1Count)
  SELECT StaffName, COUNT(*) FROM ViewJob
  WHERE InStage1 = 1
  GROUP BY StaffName

INSERT INTO @ResultTable (StaffName, Stage2Count)
  SELECT StaffName, COUNT(*) FROM ViewJob
  WHERE InStage2 = 1
  GROUP BY StaffName

Bu parçacıkta, her iki aşamada da işi olan bir personel üyesi @ResultTable içinde iki kez görünür ki bu da istenen bir sonuç değildir.

Çözüm: Upsert İşlemini Gerçekleştirmek

Bu sorunu çözmek için, @ResultTable içindeki kayıtları hem ekleyecek hem de güncelleyecek bir Upsert yaklaşımını uygulamamız gerekiyor. İşte bunu nasıl yapacağınıza dair adım adım bir inceleme:

Adım 1: Sonuç Tablosunu Tüm Personel ile Başlatma

Öncelikle, tüm personel üyelerini sonuç tablonuza eklerken başlangıç sayıları sıfır olarak ayarlayın. Bu, her personel üyesinin tabloda temsil edildiğinden emin olmanızı sağlar.

INSERT INTO @ResultTable (StaffName, Stage1Count, Stage2Count)
SELECT StaffName, 0, 0 FROM ViewJob
GROUP BY StaffName

Adım 2: Aşama Sayılarını Güncelleme

Sonra, her aşama için sayıları güncellememiz gerekiyor. İşte görünümünüzden iş sayısına göre değerlerini ayarlamak için UPDATE ifadesini kullanan SQL komutlarını uygulayın:

Aşama 1 Sayısını Güncelleme

UPDATE @ResultTable
SET Stage1Count = (
  SELECT COUNT(*) FROM ViewJob
  WHERE InStage1 = 1 AND @ResultTable.StaffName = StaffName
)

Aşama 2 Sayısını Güncelleme

UPDATE @ResultTable
SET Stage2Count = (
  SELECT COUNT(*) FROM ViewJob
  WHERE InStage2 = 1 AND @ResultTable.StaffName = StaffName
)

Sonuç

Bu adımları takip ederek, SQL Server’da karmaşık yinelemelere veya göstergelere başvurmadan etkili bir Upsert işlemi gerçekleştirmiş olursunuz. Bu yöntem, veritabanınızdaki her personel için farklı aşamalarda doğru iş sayısını kolayca yönetip güncellemenizi sağlar.

Son Düşünceler

Upsert metodolojisini kullanmak, SQL sorgularınızın verimliliğini artırmakla kalmaz, aynı zamanda veritabanı yönetimi çabalarınızı da basitleştirir. Personel atamalarının net bir şekilde gösterilmesi, veri analizi ve raporlama sonuçlarını büyük ölçüde iyileştirir.

Eğer SQL sorgularınızla ilgili herhangi bir sorunuz varsa veya daha fazla yardıma ihtiyaç duyuyorsanız, lütfen aşağıdaki yorumlarda bizimle iletişime geçin!