Oracle Ders 19 – Join – 02

Merhaba Arkadaslar,
Bir onceki yazimda Equality Join konusunu islemistik bu yazimda join konusuna devam edecegim. Bir onceki derste olusturdugumuz tablolar uzerinde devam edecegim.

Non Equality kavraminin cok bir fark, daha once between … and yapisini kullanmistik. Bu yapinin join ile kullanilmasina Non Equality Join yapisi denir. Yani bookid = 3 degilde between 3 and 10 .

Non Equaliy Join : Geleneksel (Traditional)

select b.title , p.gift 
from books b, promotion p
where b.retail between p.minretail and p.maxretail;


Non Equality Join : JOIN

select b.title , p.gift 
from books b join promotion p
on b.retail between p.minretail and p.maxretail;

Iki sorgumuzda ayni sonucu dondurmektedir. Gordugunuz between.. and yapisini geleneksel yontemle (where) ya da Join… On yapisi ile kullanabiliriz.

01 oracle ders 18 non equality join


Self Join

Bazi durumlarda , ayni tabloyu kendisiyle birlestirme ihtiyaci olur. Ornegin customers tablomuzda referred alani bulunmaktadir. Yani musteri getir kazan mantigi 🙂 Hangi musteri kimi getirmis gibi bir sorgu ihtiyaci oldugunda (Yani ayni tabloya 2 defa ulasmamiz gerekir) self join yapisindan yararlaniriz.

select r.customer#,r.firstname , r.lastname , c.lastname "Referred"
from customers c, customers r
where c.referred = r.customer#;
select r.customer#,r.firstname , r.lastname , c.lastname "Referred"
from customers c join customers r
on c.referred = r.customer#;

02 oracle ders 18 self join


Outer Join

Euality , Non Equality ve Self Join yapilarini gorduk. Bu tip joinler , inner join olarak adlandirilir. inner join yapilarinda eger aranan sart saglanirsa bir sonuc donecektir. (p.pubid = b.pubid ve ya between … and yapisi)
Outer Join yapisinda eslesmeyen veriler de gelir ve eslesmeyen verinin karsisinda null degeri olur.Outer Join yapisi  where anahtar kelimesi ile yapilabildigi gibi outer join anahtar kelimesiyle de yapilabilir.

Outer Join : Geleneksel (Traditional)
Oracle 11 G ye eslesmeyen kayitlari da getir demenin yolu ( +) operatorunu kullanmaktir. Bu + operatorunu where anahtar kelimesinden sonra kullaniriz.

select c.lastname , c.firstname, o.order#
from customers c , orders o
where c.customer# = o.customer#(+)
order by order# nulls first;

03 oracle ders 18 outer join 1

Bu sorgumuzda eger + operatorunu kullanmasaydik null degerler gelmezdi yani sadece sartin saglandigi ( c.customer# = o.customer# ) kayitlar gelirdi.
Burada customer tablosu deficient table (eksik kalan) olarak isimlendirilir.Oracle bu eksikligi null degerler ile doldurur.
Geleneksel outer join yonteminin bazi kisitli durumlari vardir ;
Iki yonlu kullanamayiz, yani iki taraftaki eslesmeyen kayitlari getiremeyiz.
in ve or operatorleriyle birlikte kullanamayiz.

Outer Join : Join
Geleneksel yontemde bazi kisitlamalar vardi, join yapisinda ise bu kisitlamalardan kurtuluruz.
Outer Join yapisini Left, Right , Full anahtar kelimelerini kullanarak olusturabiliriz.
2 tablo dusunelim, birbiriyle join islemi yaptigimizda , Left join yapisini kullandigimizda null eslesen kayitlarla birlikte ilk tablodaki eslesmeyen kayitlar da gelir.
Right Join yapisinda bu sefer ikinci tablodaki eslesmeyen kayitlarla birlikte sonuc doner.
Full Join yapisinda ise hepsi birlikte gelir 🙂

Simdi farklari daha iyi anlayabilmek icin su tablolarimizi olusturup kayitlari ekleyelim.

create table oracle_t1 ( 
t_id number,
column1 varchar2(20)
);

create table oracle_t2 ( 
t2_id number,
t_id number,
column2 varchar2(20)
);

insert into oracle_t1 values (1, 'Record1');
insert into oracle_t1 values (2, 'Record2');
insert into oracle_t1 values (3, 'Record3');
insert into oracle_t1 values (4, 'Record4');
insert into oracle_t1 values (10,'Record5');
insert into oracle_t1 values (15,'Record6');

insert into oracle_t2 values (1,1, 'RecordA');
insert into oracle_t2 values (2,2, 'RecordB');
insert into oracle_t2 values (3,null, 'RecordC');
insert into oracle_t2 values (4,null, 'RecordD');


Inner Join
Oncelikle inner join ile eslesen kayitlari gorelim sonrasinda outer join yapisina gecelim.

select o1.t_id, o1.column1 , o2.column2 from oracle_t1 o1 
join oracle_t2 o2 on (o1.t_id = o2.t_id);

veya

select o1.t_id, o1.column1 , o2.column2 from oracle_t1 o1 
inner join oracle_t2 o2 on (o1.t_id = o2.t_id);

Gordugunuz gibi her iki tablo icin eslesen kayitlar geldi. (o1.t_id = o2.t_id) olan kayitlar)

04 oracle ders 18 inner join

Left Outer Join

select o1.t_id, o1.column1 , o2.column2 from oracle_t1 o1 
left outer join oracle_t2 o2 on (o1.t_id = o2.t_id);;

05 oracle ders 18 left outer join

Gordugunuz gibi eslesen kayitlar geldi bununla birlikte ilk tablomuzdaki diger kayitlar da geldi. Eslesme saglanamadigi icin column2 alani null olarak dolduruldu.

Right Outer Join

select o1.t_id, o1.column1 , o2.column2 from oracle_t1 o1 
right outer join oracle_t2 o2 on (o1.t_id = o2.t_id);

06 oracle ders 18 right join

Gordugunuz gibi bu sefer de eslesen kayitlarla birlikte ,sagdaki tablo icin diger 2 kayit da geldi ve eslesme olmadigi icin null degerle dolduruldu.

Full Outer Join

select o1.t_id,o2.t2_id, o1.column1 , o2.column2 from oracle_t1 o1 
full outer join oracle_t2 o2 on (o1.t_id = o2.t_id);

07 oracle ders 18 full outer join

Gordugunuz gibi eslesen kayitlarin yani sira iki tarafta bulunan eslesmeyen kayitlar da geldi ve eslesmeyen kayitlar icin diger alanlar null olarak dolduruldu.

Son olarak geleneksel join ile full outer join yaklasimi gerceklestirilemez.
Yazimi burada noktaliyorum 🙂

Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *