Pusula Akademi Oracle grubundan Anıl’ı bu güzel makalesi için tebrik ediyoruz.Devamını bekliyoruz
Merge, tablolar arası birleştirme işlemi yapar yani iki tablo birleştirilecek ise kolonlar kontrol edilerek dataların durumuna göre update veya insert işlemleri ile birleştirme yapılmış olur. Merge kullanarak programlama bazında çoklu else-if yapısından kurtulmuş oluruz.
Merge kullanımı için basit bir uygulama yapacağız, bunun için öncelikle iki tablo create edip, data insert edeceğiz..
create table ogrenci
(
no number,
ad varchar2(10)
);
insert into ogrenci(no,ad) values(1,’Anıl’);
insert into ogrenci(no,ad) values(2,’Okan’);
insert into ogrenci(no,ad) values(3,’Reşat’);
Kodlarda görüldüğü üzere bir öğrenci tablosu oluşturuldu ve 3 data eklendi. Bu işlemleri select * from ogrenci order by 1; ile aşağıdaki hali ile karşımızdadır.
Daha sonra ki işlemimizde ise tekrardan ogrenci2 adında bir tablo oluşturulacak ve yukardaki işlemleri takip eder nitelikte 3 data eklenecektir. Kodları:
create table ogrenci2
(
no number,
ad varchar2(10)
);
insert into ogrenci2(no,ad) values(1,’Anıl’);
insert into ogrenci2(no,ad) values(2,’Çağatay’);
insert into ogrenci2(no,ad) values(3,’Tolga’);
İşlemlerimiz sonrası tabloyu select * from ogrenci2 order by 1; komutu ile listeletme işlemi yapıyoruz
merge into ogrenci2 iki
using(select no,ad from ogrenci) bir
on (bir.no=iki.no)
WHEN MATCHED THEN
UPDATE SET iki.ad = bir.ad
WHEN NOT MATCHED THEN
INSERT (iki.no,iki.ad)
VALUES (bir.no,bir.ad);
Daha sonra da Merge işlemi yapılır .Yukarıda ki kodlar da yapılmak istenen, öğrenci tablosundaki dataları al ogrenci2 tablosunda ki datalar ile birleştir yani data var ise update (değiştir, güncelle) yok ise insert (ekle) et ve son olarak bu uygulamamızda select * from ogrenci2 order by 1; kodu ile birleştirme sonrası değişiklikleri gözlemleyeceğiz,
Üstte görünen resimde ki gibi data olmadığından insert işlemi olmadı ama “2” no lu Çağatay ve “3” nolu Tolga datası Okan ve Reşat datası olarak update edilmiştir. Bu basit uygulama sonrası biraz daha kapsamlı bir şekilde Merge komutunun görevini inceleyeceğiz…
Soru: İki tane personel tablosu var ve ortak kolonların yanında farklı kolonlarda bulunmaktadır, bunun için nasıl bir merge işlemi uygulanmalıdır?
Bu soru için ilk önce iki adet tablo oluşturup data insert edeceğiz: Personel tablosu ve dataların listelenmesi aşağıdaki gibidir.
create table personel
(
id number(5),
ad varchar2(10),
soyad varchar2(10),
dept_no number(10),
maas number(10)
);
insert into personel(id,ad,soyad,dept_no,maas) values(1,’Anıl’,'Erdoğan’,100,1500);
insert into personel(id,ad,soyad,dept_no,maas) values(2,’Çağatay’,'Aksu’,100,1200);
insert into personel(id,ad,soyad,dept_no,maas) values(3,’Tolga’,'Açıkgöz’,200,2500);
insert into personel(id,ad,soyad,dept_no,maas) values(4,’Veysel’,'Maden’,200,2700);
select * from personel
Personel2 tablosu ve dataların listelenmesi aşağıdaki gibidir.
create table personel2
(
id number(5),
ad varchar2(10),
soyad varchar2(10),
dept_no number(10),
mail varchar2(10)
);
insert into personel2(id,ad,soyad,dept_no,mail) values(8,’Ahmet’,'Erdi’,100,’[email protected]’);
insert into personel2(id,ad,soyad,dept_no,mail) values(7,’Bilal’,'Akman’,100,’[email protected]’);
insert into personel2(id,ad,soyad,dept_no,mail) values(9,’Tarık’,'Kinin’,200,’[email protected]’);
insert into personel2(id,ad,soyad,dept_no,mail) values(5,’Kerem’,'Sönmez’,200,’[email protected]’);
select * from personel2 order by 1;
İki tabloyu da oluşturduk, bakıldığında personel tablosunda maaş kolonu varken, personel2 tablosunda bulunmamaktadır aynı şekilde personel2 tablosunda mail kolonu varken, personel tablosunda bulunmamaktadır ve yapacağımız işlem iki tabloyu da kapsayacak şekilde yeni bir tablo oluşturmak ve bu iki personel tablosunu ortak tabloya merge etmek olacaktır..
merge into ortak_personel iki
using(select id,ad,soyad,dept_no,maas from personel) bir
on (bir.id=iki.id)
WHEN MATCHED THEN
UPDATE SET iki.ad = bir.ad,
iki.soyad = bir.soyad,
iki.dept_no = bir.dept_no,
iki.maas = bir.maas,
iki.mail = null
WHEN NOT MATCHED THEN
INSERT (iki.id,iki.ad,iki.soyad,iki.dept_no,iki.maas,iki.mail)
VALUES (bir.id,bir.ad,bir.soyad,bir.dept_no,bir.maas,null);
Yukarıdaki işlemde personel tablosu ortak_personel tablosuna merge edildi ve personel tablosunda mail kolonu olmadığından ortak_personel tablosunda bulunan mail kolonuna null değer aktarıldı.
select * from ortak_personel order by 1 ? Kodu sonrası aşağıdaki listeye ulaşırız.
Daha sonra ise personel2 tablosunu ortak_personel tablosuna merge ediyoruz.
merge into ortak_personel iki
using(select id,ad,soyad,dept_no,mail from personel2) bir
on (bir.id=iki.id)
WHEN MATCHED THEN
UPDATE SET iki.ad = bir.ad,
iki.soyad = bir.soyad,
iki.dept_no = bir.dept_no,
iki.maas = null,
iki.mail = bir.mail
WHEN NOT MATCHED THEN
INSERT (iki.id,iki.ad,iki.soyad,iki.dept_no,iki.maas,iki.mail)
VALUES (bir.id,bir.ad,bir.soyad,bir.dept_no,null,bir.mail);
Bu kod ile merge işlemimizin sonrasında meydana gelen değişiklikleri görüyoruz:
select * from ortak_personel order by 1;
Merge işlemini size iki örnek ile anlatmaya çalıştım umarım faydalı olmuştur, bir sonraki VİEW konulu makalem de görüşmek dileği ile… Anıl ERDOĞAN