Etiketler

, ,


ORACLE | MERGE INTO  | Tek bir tablo üzerinde çalışmak | Hedef İle Kaynağın Aynı Tablo Olduğu Durum

Eğer kayıt varsa güncelle et , yoksa yeni kayıt ekle (IF EXISTS UPDATE ELSE INSERT)”

koşulunu SQL de ORACLE da bir çok yöntemle yapabilmekteyiz.

En klasik olanlarından :

IF (EXISTS (SELECT * FROM TabloAdi AS t1
WHERE koşul))
begin
UPDATE TabloAdi
SET update_edilecek_deger
WHERE koşul
end
else
begin
INSERT INTO TabloAdi ( alanlar )
VALUES( degerler )
end

çözüm olacaktır. Fakat Oracle bu durumlar için “MERGE INTO” DML yapısını geliştirmiş. Merge Into kullanımın en genel hali aşağıdaki gibidir.

MERGE INTO TableAdi U1
USING (Sorgu Cümlesi (Select * from Tablo2)U2
ON (U1.sutunAdi = U2.sutunAdi)
when matched then
UPDATE SET U1.alanAdi2 = deger
when NOT matched then
INSERT(alanlar)
VALUES(degerler)

Genel olarak bu yapıda esas olan kaynak ve hedef tablolarıdır.

MERGE INTO TableAdi => Hedef
USING ( … ) => Kaynak
ON ( … ) => Kaynak ile Hedefin birbirine bağlanacağı ilişki

Sentaks olarak yazması kısa ve işlevi nettir. Fakat dikkat edilmesi gereken özel durumlar söz konusudur. Örneğin Kaynak Sorgusun eğer değer döndürmüyorsa yapının değeri “matched” yada “ Not matched” değildir. Dolayısıyla hiçbir işlem yapmadan sorgudan çıkar.

Ayrıca UPDATE yada INSERT bölümüne ” DELETE FROM U1 where kosul “ da ekleyebilirsiniz.

İnternette kolayca bulamayacağınız en özel durumlardan biride hedef ile kaynağın aynı olduğu (tek bir tablo üzerinde işlem yapıyorsanız) durumlardır. Bu durumda aynı anlama gelen kullanabileceğiniz iki sentaks vardır.

MERGE INTO TableAdi U1
USING (U1.alanAdi = koşul )
when matched then
UPDATE SET U1.alanAdi2 = deger
when NOT matched then
INSERT(alanlar)
VALUES(degerler)

İle hedef ve kaynağın aynı tablo olduğunu belirtmiş olursunuz. Kaynağın boş olma durumunu otomatikman ekarte etmiş olursunuz.

Diğeri ise kaynağın her koşulda boş olmayacağını garanti edecek bir trick kullanmak olacaktır. Bunu da

select 1 from DUAL

ile sağlayabiliriz.

MERGE INTO TableAdi U1
USING (Select 1 From Dual) U2
ON(U1.alanAdi = koşul )
when matched then
UPDATE SET U1.alanAdi2 = deger
when NOT matched then
INSERT(alanlar)
VALUES(degerler)

Darısı SQL’in başına artık…