Etiketler

, ,


Natural Join” kullanımını ve avantajlarını sizlerle paylaştığım [PL-SQL / T-SQL : NATURAL JOIN] yazımın ardından, gerçekleştirdiğim testlerde, sorgu sonuçlarımın tutarsız veriler döndürdüğünü farkettip, kullanmamanız yönünde sizi uyarmıştım.


!!!ÖNEMLİ!!!!
https://dervisali.wordpress.com/2009/08/05/pl-sql-t-sql-natural-join/ 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. (07.08.2009)


Natural Join Test Sonuçları (13.10.2009)

Bu yazımda sizinle test sonuçlarımı ve tespitlerimi paylaşacağım. En azından tutarsızlığın hangi durumlarda oluştuğunu tespit etmiş durumdayım.Aşağı Entity Relationship (ER – Varlık(Tablo) İlişkileri) diyagramını gördüğünüz tablolar üzerinde test çalışmalarını gerçekleştireceğiz. (Not : Resimleri büyütmek için üzerlerine tıklayınız.)

Ana tablomuzun yapısı ve verileri : (NATURAL_JOIN_TEST)

Referans tabloların yapıları ve içerikleri : (TEST_REFERANS_TABLO1 ve TEST_REFERANS_TABLO2)

Yukarıda da görüldüğü üzere, ana tablomuz 8 kayıttan oluşmaktadır. Ana tablomuza referans tabloları natural join ile bağlayacağımızdan ( natural join = inner join), test edeceğimiz tüm sorgularda toplam kayıt sayımızın değişmemesini beklemekteyiz. (Bknz : Natural Left Join , Natural Right Join için https://dervisali.wordpress.com/2009/08/05/pl-sql-t-sql-natural-join/)

TEST 1 : Ana tablo ile 2 referans tabloyu Natural Join ile birbirine bağlayıp, tüm alanları getiren bir “Select All (Select * From …) ” sorgusu çalıştırıyoruz.

Sorgu sonucunda dönen kayıt sayısı beklenildiği gibi 8. Sorgumuz tüm alanları getirmersi söz konusu olduğunda doğru çalışmaktadır.

Test 2 : Ana tablo ile 2 referans tabloyu Natural Join ile birbirine bağlayıp, sadece ana tablonun herhangi bir sutununu getiren “Select by custom column (Select Column1 From …) ” sorgusu çalıştırıyoruz.

ya da

Sorgu sonuçlarında dönen kayıt sayısı 24. Halbuki 8 kayıt gelmeliydi. Sorgumuz hatalı çalıştı.

Test 3 : Ana tablo ile 2 referans tabloyu Natural Join ile birbirine bağlayıp, sadece ana tablonun herhangi birkaç sutununu getiren “Select by custom columns (Select Column1,Column2 From …) ” sorgusu çalıştırıyoruz.

Sorgu sonuçlarında dönen kayıt sayısı 24. Halbuki 8 kayıt gelmeliydi. Sorgumuz hatalı çalıştı.

Bu arada, tek alan getiren soru ile iki alan getiren sorgunun zaten farkının olması beklenemezdi gibilerinden dediğinizi duyar gibi oluyorum. Ama durumun hiç de öyle olmadığını yazısın devamında göreceksiniz.

Detaylarını yine [PL-SQL / T-SQL : NATURAL JOIN] adlı yazımda belirtiğimim yapıdan dolayı,
Birleştirmede kullandığınız bir alanı, ana tabloyu belirleyici olarak tanımlayıp sorgulamaya çalıştığınızda, ORA-00904 (geçersiz belirleyici / invalid column name) hatası alırsınız.

Niteliyici (Qualifier) kullanarak sorgulamak isterseniz, bu kez de ORA-25155 ( Natural birleştirmede kullanılan sutunun niteliyicisi olamaz / column used in Natural join can not have qualifier ) hatası alırsınız.

“Test 1” de kullandığımız “Select All” sorgusunu bir görünümde(view) kullanıp, bu görünüm üzerinden sorgu çalıştırmak istediğinizde, ORA-00918 (Column ambiguosly defined) hatası alırsınız.

Bu genel durumları da belirttikten sonra, testimizi son birkaç deneme daha yaparak sonuçlandıralım.

Test 4 : Ana tablo ile 2 referans tabloyu Natural Join ile birbirine bağlayıp, sadece birleştirmede kullandığımız alanları getiren “Select by joined columns” sorgusu çalıştırıyoruz.

Sorgu sonuçlarında dönen kayıt sayısı 8. Bu kez sorgumuz beklenildiği gibi 8 kayıt getirdi. Doğru çalıştı.

Test 5 :Ana tablo ile 2 referans tabloyu Natural Join ile birbirine bağlayıp, birleştirmede kullandığımız alanları ve herhangi diğer alanları getiren “Select by joined columns and some others” sorgusu çalıştırıyoruz.

Sorgu sonuçlarında dönen kayıt sayısı 8. Bu kez de sorgumuz beklenildiği gibi 8 kayıt getirdi. Doğru çalıştı.
SONUÇ : Natural Join , Natrual birleştirmede kullandığınız alanları içeren sorgularda, INNER JOIN gibi çalışmakta, bu alanları içermeyen sorgularda ise CROSS JOIN gibi çalışmaktadır. Direk bu hata olmasada, Natural Join özelinde Oracle bildirilmiş ve 11g de çözülmüş bir hata kaydına MetaLink de rastladım. Görünen o ki Natural join ile ilgili Oracle özelinde düzeltilmesi gereken hatalar henüz bitmemiş.

Lokalinizde test çalışmalarınızı gerçekleştirmek için yukarıdaki tablolara ait pl-sql cümlerini http://www.mehmetozakan.com/Download/naturalJoinTest_PLSQL_SCRIPT.txt adresinden indirebilirsiniz.


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