Etiketler

, , ,


!!!ÖNEMLİ!!!!

Natural Join ile ilgili testlerimi tamamlandım. Tespit ve sonuçlarımı [PL-SQL / T-SQL : NATURAL JOIN ] / Test Sonuçları isimli yazımdan okuyabilirsiniz. (13.10.2009)


!!!ÖNEMLİ!!!!

https://dervisali.wordpress.com/2009/10/13/pl-sql-t-sql-natural-join-test-sonuclari/ isimli yazımda detaylı kullanımını bahsettiğim “NATURAL JOIN” kalıbı üzerinde gerçekleştirdiğim yeni testlerde bir takım anormallikler ve hatalarla karşılaştım.
(Testlerimi gerçekleştirdiğim platform, Oracle 10g R2 & 11g )

Karşılaştığım hatalar ve anormallikler ile ilgili en kısa zamanda yeni bir yazı paylaşacağım. Yeni yazıma kadar Oracle da Natural Join kullanmanızı tavsiye etmiyorum. (7.08.2009)


NATURAL JOIN Kullanımı / Avantajları

T-SQL de olsun PL-SQL de olsun en çok kullandığımız bağlaçlardır “JOIN” ler. Left, Right, Cross Inner /Outher Join kullanımına aşina olduğumuz kalıplardandır. Bugün size pek fazla bilinmeyen bir “NATURAL JOIN” kalıbından bahsedeceğim.

Natural join, iki tablo arasında aynı isimde olan sütunları birbiriyle otomatik olarak bağlayan bir kalıptır.

Örneğin :
[MUSTERI] isimli [musteri_id] , [musteri_adres_id], [musteri_ana_tip_kodu], [musteri_alt_tip_kodu], [musteri_uyelik_durum_kodu] , … sütunlarına sahip bir ana tablomuz ve bu tabloya ait [MUSTERI_ADRES] isimli ve en azından [musteri_adres_id] isimli bir sütunu olan bir detay tablomuz olsun. Bu tabloların arasındaki ilişkinin 1-1 yada 1-n olup olmaması önemli değildir. Bağlamak için kullanacağımız sütunların PK(Primary Key) yada FK(Foreign Key) olup olmaması önemli değildir.

Mühim olan her iki tabloda da bu sütün adlarının aynı olmasıdır.


Select  *
from    [MUSTERI] M
, [MUSTERI_ADRES] MA
where   M.[musteri_adres_id] = MA.[musteri_adres_id] ;

ile ya da

Select *
from   [MUSTERI] M
Inner Join [MUSTERI_ADRES] MA
ON M.[musteri_adres_id] = MA.[musteri_adres_id] ;

İle sorgumuzu çalıştırdığımızda, sistemde kayıtlı adresi olan müşterileri bize getirecektir.
Natural Join kullanarak bu sorguyu aşağıdaki gibi pratik bir şekilde yazabilirsiziniz.

Select * from
[MUSTERI] Natural Join [MUSTERI_ADRES] ;

Yukarıdaki sorgu üste verdiğimiz iki sorguyla aynı sonuçları verecektir. Eğer veri tabanı tasarımızı yaparken, tablo sütün isimlendirmesinde standartlara uyduysanız, veri tabanız natural join kalıbını kullanmaya uygundur. Avantajı aslında sadece yazımının kolay olası değildir elbet. En üstdeki 2 sorguda * ile sorgulamamızın sonucu olarak, iki tabloda da olan [musteri_adres_id] gereksiz yere iki kere tekrarlanacaktır. Eğer Create view … as ile bu sorgu cümlelerini kullanmak isterseniz, “tekrar eden sütün ismi” hatası alırsınız. Bunu önlemek için maalesef, tüm alanları tek tek eklemek durumunda kalırsınız. Halbuki Natural join, tekrar eden bu sütünü sorgu sonucunda listelemez. Sadece bir adet [musteri_adres_id] sorgu sonucunda döndürür.

Bunlara ilaveten, tarafımca tercih etmemin en büyük sebeplerinden bir tanesi de referans tablolardaki [tanım] alanlarını ana tabloda göstermedeki pratikliktir.

Select * from
[MUSTERI] Natural Join [MUSTERI_ADRES] Natural join [MUSTERI_UYELIK_DURUM] Natural Join [MUSTERI_ANA_TIP] Natural Join [Musteri_ALT_TIP];

İle 5 tablodaki tüm verileri bir biriyle bağlayabilirsiniz. Ya da aşağıdaki sorguyu tercih edebilirsiniz.

Select  *
from    [MUSTERI] M
, [MUSTERI_ADRES] MA
, [MUSTERI_UYELIK_DURUM] MUD
, [MUSTERI_ANA_TIP] MANAT
, [Musteri_ALT_TIP] MALTT
where   M.[musteri_adres_id] = MA.[musteri_adres_id]
AND M.[musteri_uyelik_durum_kodu] = MUD.[musteri_uyelik_durum_kodu]
AND M.[musteri_ana_tip_kodu] = MANAT.[musteri_ana_tip_kodu]
AND M.[musteri_alt_tip_kodu] = MALTT.[musteri_alt_tip_kodu]
AND M.[musteri_ana_tip_kodu] = MALTT.[musteri_ana_tip_kodu] ;

Özetle; Natutal Join, Inner Join‘in pratik bir kullanımıdır. Left Join için Natural Left Join , Right Join için se Natual Right Join ‘ i kullanabilirsiniz.

En iyi pratiği kendir tablolarınız üzerinde deneyerek gerçekleştirebilirsiniz.

Kolay gelsin.


Diğer join işlemlerini farklı bir yaklaşımla incelemek için :