Veritabanımızda buluanan bir tablodaki alanları diğer tablolardaki alanlardaki verilerle güncellemek istediğimizde genel olarak önce bir sorgu ile bu değerler diğer tablolardan çekilir ve sonra update sorgusu çalıştırılır. Fakat join ile tek sorguda update yapabilme şanşımız var.

İki tane tablomuz olsun. Bu iki tablomuzunda alanları aynı olsun.

TABLO1

  • ID
  • BASLIK

TABLO2

  • ID
  • BASLIK

Bu iki tablonun ID alanları aynı olan satırların TABLO1’deki BASLIK alanını TABLO2’deki BASLIK alanındaki değer yapalım.

İsterseniz daha iyi anlaşılması sorgumuzu için önce Mssql ile yazalım daha sonra Oracle ile yazalım.

MSSQL

UPDATE A
SET A.BASLIK=B.BASLIK
FROM TABLO1 A
INNER JOIN TABLO2 B ON A.ID=B.ID

ORACLE

MERGE INTO TABLO1 A
USING
(
     SELECT ID,BASLIK FROM TABLO2
) B
ON (A.ID= B.ID)
WHEN MATCHED THEN
UPDATE SET A.BASLIK= B.BASLIK;

Sorgumuza bir koşul ekleyelim, TABLO1’deki ID değerinin 5 olduğu satırda udpate yaptıralım.

MERGE INTO TABLO1 A
USING
(
     SELECT ID,BASLIK FROM TABLO2
) B
ON (A.ID= B.ID AND A.ID='25')
WHEN MATCHED THEN
UPDATE SET A.BASLIK= B.BASLIK; 

Oracle’daki sorgumuzu biraz açıklamaya çalışayım.

“MERGE INTO TABLO1 A” burada update yapılacak tablomuzu belirliyoruz.
“USING(...)” içerisinde join yapılacak tablodan kayıtları çeken select sorgusu yapıyoruz ve “ON” ifadesinde koşulları belirtiyoruz.
“WHEN MATCHED THEN” ifadesinden sonra update sorgumuzu yazıyoruz. Türkçesi ‘ifadesindeki koşullar sağlandığında’ gibi bişey olsa gerek :). Eğer eşleşme olmadığında bir işlem yapmak istersek “WHEN NOT MATCHED THEN” ifadesini ekliyoruz Şöyleki :

MERGE INTO TABLO1 A
USING
(
     SELECT ID,BASLIK FROM TABLO2
) B
ON (A.ID= B.ID)
WHEN MATCHED THEN
    UPDATE SET A.BASLIK= B.BASLIK
WHEN NOT MATCHED THEN
    INSERT (A.BASLIK) VALUES(B.BASLIK); 

“WHEN NOT MATCHED THEN” ifadesinden sonraki INSERT sorgumuzu yazıyoruz. Burada dikkat etmeniz gereken INSERT sorgusunda INTO ifadesinin yer almaması.

16.12.2011 tarihinde güncellendi.