Verileri birden çok tabloya göre birleştirme

Tamamlandı

Veritabanı işlemlerinde bazen BIR SQL MERGE işlemi gerçekleştirmeniz gerekebilir. Bu DML seçeneği, diğer tabloda bulunan farklara göre bir tabloya satır ekleyerek, güncelleştirerek veya silerek iki tabloyu eşitlemenizi sağlar. Değiştirilen tablo hedef tablo olarak adlandırılır. Hangi satırların değiştirileceğini belirlemek için kullanılan tablo kaynak tablo olarak adlandırılır.

MERGE, bir veya daha fazla koşula göre verileri değiştirir:

  • Kaynak verilerin hedef tabloda eşleşen bir satırı olduğunda, hedef tablodaki verileri güncelleştirebilir.
  • Kaynak verilerin hedefte eşleşmesi olmadığında, hedef tabloya veri ekleyebilir.
  • Hedef verilerin kaynakta eşleşmesi olmadığında hedef verileri silebilir.

Merge deyiminin genel söz dizimi aşağıda gösterilmiştir. Hedefle belirtilen sütundaki kaynağı eşleştiriyoruz ve hedef ile kaynak arasında bir eşleşme varsa, hedef tabloda gerçekleştireceğiniz eylemi belirtiriz. Eşleşme yoksa bir eylem belirtiriz. Eylem bir INSERT, UPDATE veya DELETE işlemi olabilir. Bu kod, kaynak ve hedef arasında bir eşleşme olduğunda bir UPDATE gerçekleştirildiğini gösterir. Kaynakta hedefte eşleşen veri olmayan veriler olduğunda INSERT gerçekleştirilir. Son olarak, hedefte kaynakta eşleşme olmayan veriler olduğunda DELETE gerçekleştirilir. MERGE deyiminin başka birçok olası biçimi vardır.

MERGE INTO schema_name.table_name AS TargetTbl
USING (SELECT <select_list>) AS SourceTbl
ON (TargetTbl.col1 = SourceTbl.col1)
WHEN MATCHED THEN 
   UPDATE SET TargetTbl.col2 = SourceTbl.col2
WHEN NOT MATCHED [BY TARGET] THEN
   INSERT (<column_list>)
   VALUES (<value_list>)
WHEN NOT MATCHED BY SOURCE THEN
   DELETE;

Yalnızca ihtiyacınız olan MERGE deyiminin öğelerini kullanabilirsiniz. Örneğin, veritabanının, mevcut faturalar ve yeni faturalarda yapılan düzeltmelerin bir karışımını içeren bir aşamalı fatura güncelleştirmeleri tablosu içerdiğini varsayalım. Fatura verilerini gerektiği gibi güncelleştirmek veya eklemek için WHEN MATCHED ve WHEN NOT MATCHED yan tümcelerini kullanabilirsiniz.

MERGE INTO Sales.Invoice as i
USING Sales.InvoiceStaging as s
ON i.SalesOrderID = s.SalesOrderID
WHEN MATCHED THEN
    UPDATE SET i.CustomerID = s.CustomerID,
                i.OrderDate = GETDATE(),
                i.PurchaseOrderNumber = s.PurchaseOrderNumber,
                i.TotalDue = s.TotalDue
WHEN NOT MATCHED THEN
    INSERT (SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue)
    VALUES (s.SalesOrderID, s.CustomerID, s.OrderDate, s.PurchaseOrderNumber, s.TotalDue);