Oracle SQL: LATERAL, CROSS APPLY, OUTER APPLY

Herkese Selam,

Bu yazıda sizlere Oracle 12c ile SQL tarafında yapılan yeniliklerden LATERAL, CROSS APPLY ve OUTER APPLY söz deyimlerinden bahsedeceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

Oracle 12c öncesi veri tabanı versyonlarında sorgu yazarken, sorgumuzun FROM kısmında correlated subquery kullanamıyorduk. Oracle 12c ile beraber bu tarz kullanımlarımıza ve ihtiyaçlarımıza karşılık olarak gerekli alt yapıyı kullanımımıza açmış durumda.

Şimdi örnekler ile bu yapının nasıl çalıştığını görelim.

Öncelikle 11g veritabanımızda aşağıdaki sorguyu çalıştırdığımızda elde ettiğimiz sonuca bakalım.

SELECT *
FROM hr.employees e,
  (SELECT * FROM hr.departments WHERE department_id = e.department_id) x;

ORA-00904: "E"."DEPARTMENT_ID": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 14 Column: 55

Evet sorgumuzun içinde from kısmında yazdığımız subselect dışarda kullandığımız employees tablosuna bağımlı.
Bu bağımlılıktan dolayı Oracle subquerry içerisindeki dışa bağımlı ilgili parametreyi tanımlayamadı ve hata aldı. Evet Oracle işte tam bu noktada gerekli geliştirmeleri yaparak kullanıcıya bu tarz kullanımların önünü açmış oldu.
Şimdi bu ihtiyacı 12c veritabanında gerçeklemeye çalışalım.

SELECT *
FROM hr.employees e,
  LATERAL
  (SELECT * FROM hr.departments WHERE department_id = e.department_id) x
WHERE x.department_name ='Public Relations';

Evet sorgumuzu çalıştırdığımızda sonucun başarılı bir şekilde döndüğünü görmekteyiz. Bu komut ile artık FROM tarafında corelated subquerry kullanabildik. Peki sorgumuzun execution planına bakalım.

lateral join

Şimdi CROSS APPLY ve OUTER APPLY‘a bakalım. CROSS APPLY ve OUTER APPLY’da LATERAL alt yapısına benzer bir yapıda çalışıyor ve benzer ihtiyaca hizmet ediyor. Aralarındaki farklar. CROSS APPLY kullanırsak otomatik olarak from da yazdığımız tabloları/inline viewları CROSS JOIN yapıyor. OUTER APPLY kullanırsak from da yazdığımız tabloları/inline viewları LEFT OUTER JOIN yapıyor.

Şimdi iki komutunda kullanımlarına bakalım.

SELECT *
FROM hr.employees e
  CROSS APPLY
  (SELECT * FROM hr.departments WHERE department_id = e.department_id) x;

Yukarıdaki sorgu 2 kümeyi cross joinle birleştirdi .

SELECT *
FROM hr.employees e
  OUTER APPLY
  (SELECT * FROM hr.departments WHERE department_id = e.department_id) x;

outer apply

 

Yukarıdaki sorgu 2 kümeyi outer joinle birleştirdi .

Evet Oracle 12c SQL ile yeni gelen bu komutlar ihtiyacımızın olacağı yerlerde işimizi bir hayli kolaylaştıracak gibi görünüyor.

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Uncategorized and tagged , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s