İç Select olarak söylediğimiz şeyin gerçek adı, SubQuery yada tam olarak SubSelect'tir. SubSelect ile JOIN'ler arasında ne fark var? Böyle sorduğunuz düşünülürse, çok fark var. Ama bunu anlatmak bazen bir hayli zor olabiliyor.
Ama siz uygulamalar yapa yapa arasındaki birden fazla farkı anlayacaksınız. Ayrıca ben burada anlatmaya kalksam paragraflar yetmez. Ben tek bir örnekle anlatmam gerekirse, tek bir örnek "mesela JOIN'lemekten kurtuluyorsunuz, ve sadece o alanı alıyorsunız.". Demem o ki uygulama yapmadan arasındaki onca farkı anlamanız mümkün değil.
SubSelect işlemleri 3 kısımda da kullanılır. Nedir bu alanlar?
1. SELECT katmanında,
2. FROM katmanında,
3. WHERE katmanında.
Bizde bunlar için her birine 1 örnek yapalım. Oracle tarafından hazırlanmış standart örnekleri şöyledir;
SELECT SUBSELECT : Aşağıda yapılmak istenen nedir? SELECT ile FROM arasında tablo sorguya genel istenilenlerin dışında bir alan çekmek için kullanılmış.
SELECT tbls.owner, tbls.table_name, (SELECT COUNT(column_name) AS total_columns FROM all_tab_columns cols WHERE cols.owner = tbls.owner AND cols.table_name = tbls.table_name) subquery2 FROM all_tables tbls;
FROM SUBSELECT : Aşağıda yapılmak istenen çok kullanılan bir yapı değil. Hiç yoktan ben hiç ama hiç kullanmadım. Fakat iki tablo yan yana çağrılmış, ama 2. tablo SubSelect ile oluşturulmuş ve gruplama yapılmış. Sonrasında da baştaki SELECT içine taşınmış. Ardından bu tabloların ID'lerini de WHERE alanında eşitlik getirmişler. Anlayacağınız 2. tablo gruplu olduğundan WHERE'e ise gruplamalı bir eşitlik sağlanmış. Sonuç olarak gruplamalı veriler getirilmek istendiği için yapılmış. Bunu ilerleyen zamanlarda kullanmanızı isterim. Bana kalırsa hiç kullanmayın. Gerek yok da.
SELECT suppliers.name, subquery1.total_amt FROM suppliers, (SELECT supplier_id, SUM(orders.amount) AS total_amt FROM orders GROUP BY supplier_id) subquery1 WHERE subquery1.supplier_id = suppliers.supplier_id;
WHERE SUBSELECT : Dönen sonucu WHERE'de eşitlemek istenmiş. Ama tek fark ilk tablonun eşitliği SubSelect'in dışında, ikinci tablonun verisi de SubSelect'in içinde olmasıdır.
SELECT *
FROM all_tables tabs
WHERE tabs.table_name IN (SELECT cols.table_name
FROM all_tab_columns cols
WHERE cols.column_name = 'SUPPLIER_ID');
Başta da dediğim gibi, SUBSELECT biraz farklıdır. Kullanılmak istendiği katmanlar ve kullanılmak istenilen amaca göre farklılıklar gösterir. Ayrıca JOIN'lemeden çok ama çok farklıdır. Bu farkı yaşayarak öğrenmenizi istiyorum. Aski halde ben anlatmakta, sizlerde anlamakta güçlük çekersiniz.
Benimle iletişime geçin. djvuslatdj@gmail.com
Hiç yorum yok:
Yorum Gönder