Bu bölümde, hedef tablodaki satırları değiştiren veya kaldıran sorgular yazmayı öğreneceksiniz. Aynı işlemde, yeni satırların eklendiği ve mevcut satırların değiştirildiği kaynak ve hedef tablolar arasında MERGE işlemi gerçekleştirmeyi öğreneceğiz.

UPDATE ile Verileri Güncellemek

SQL Server, bir tablo veya view’daki mevcut verileri değiştirmek için UPDATE ifadesiyle işlem yapar. UPDATE, WHERE ifadesinde bir koşul veya join ile tanımlanmış satır kümesi üzerinde çalışır. Hedefe yeni değerler tahsis etmek için virgülle ayrılmış bir veya daha fazla atama gerçekleştirebilen bir SET ifadesi kullanır. UPDATE ifadesindeki WHERE deyimi, SELECT deyimindeki WHERE deyimi ile aynı yapıya sahiptir.

Not: WHERE ifadesi ve/veya bir join işleminin olmadığı UPDATE işlemi, işlemden filtrelenmeyen tüm satırları hedef alır, buna dikkat etmek gerekir. Bu yüzden UPDATE ifadesini dikkatli kullanmak gereklidir.

Aşağıdaki kod, UPDATE ifadesinin temel syntax’ı gösterilmektedir:

UPDATE <TableName>
SET
<ColumnName1> = { expression | DEFAULT | NULL }
{,…n}

SET ifadesinden çıkarılmış herhangi bir sütun UPDATE işlemi tarafından değiştirilmez.

Aşağıdaki örnekte, Production.Products tablosunda birinci kategorideki tüm mevcut ürünlerin fiyatlarını artırmak için UPDATE işlemi gerçekleştirilmiştir:

UPDATE Production.Products
SET unitprice = (unitprice * 1.04)
WHERE categoryID = 1
AND discontinued = 0;

Not: Daha önceki bölümlerde bileşik atama operatörlerini öğrenmiştik. Bunlar, update ifadesinde SET deyimi ile kullanılarak aşağıda gösterildiği gibi sütunlara değer atarken kullanılabilir:

UPDATE Production.Products
SET unitprice *= 1.04
WHERE categoryID = 1
AND discontinued = 0;
MERGE İfadesinin Kullanımı

Veri tabanı işlemlerinde hedef tabloda bazı satırların güncellendiği veya silindiği ve kaynak tablodan da yeni satırların eklendiği bir SQL MERGE işlemi gerçekleştirilebilmektedir. SQL Server’ın en eski sürümlerinde MERGE ifadesi gelmeden önce, verileri güncellemek için birden fazla işlem gerekiyordu. MERGE deyimini, tümü tek bir deyimde bir kaynak veri kümesine katılmayı temel alarak hedeflenen bir satırdan satır eklemek, güncellemek ve hatta silmek için kullanabilirsiniz.

MERGE bir veya daha fazla koşula bağlı şekilde verileri değiştirir:

  • Kaynak veriler hedefteki verilerle eşleştiğinde verileri günceller.
  • Kaynak veri hedeftekiyle eşleşmediğinde, verileri ekler.
  • Hedef ve kaynakta eşleşme olmadığında, hedef verileri siler.

Not: T-SQL’de MERGE ifadesi, WHEN NOT MATCHED BY SOURCE ifadesini de desteklediğinden, bu ifade ile yapılan işlemler upsert (upate – delete) işleminden de öte, bir delupsert (delete – update – insert) işlemidir.

Aşağıdaki kod, bir MERGE ifadesinin genel syntax’ını göstermektedir. Kaynak ve hedef arasında eşleşen satırlarda update işlemi yapılır. Hedefe göre kaynakla eşleşen satır bulunmadığında bir insert işlemi yapılı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 THEN
INSERT (<column_list>)
VALUES (<value_list>);

Aşağıdaki örnek, mevcut siparişler için gönderi bilgilerini güncellemek veya eşleşme bulunamadığında yeni siparişler için satır eklemek amacıyla MERGE ifadesinin kullanımını gösterir.

Aşağıdaki örneğe bakın:

MERGE top (10) INTO Store AS Destination 
USING StoreBackup AS StagingTable 
ON (Destination.BusinessEntityID = StagingTable.BusinessEntityID)
WHEN NOT MATCHED THEN
INSERT ( BusinessEntityID
, Name
, SalesPersonID
, Demographics
, rowguid
, ModifiedDate
)
VALUES ( StagingTable.BusinessEntityID
, StagingTable.Name
, StagingTable.SalesPersonID
, StagingTable.Demographics
, StagingTable.rowguid
, StagingTable.ModifiedDate
); 

Kaynak:
MERGE (Transact-SQL)
UPDATE (Transact-SQL)