18 Haziran 2018 Pazartesi

SQL CROSS APPLY Nedir?


Genelde CROSS APPLY olayını açıklayıcı anlatan Türkçe kaynak pek yok. Ben dilim döndüğünce anlatmaya çalışacağım.

Bir örnekle açıklamak iyi olacak: Diyelimki yöneticiniz sizden her personelin ofise son 2 giriş tarihlerini istedi diyelim. Bu durumda muhtemelen ilk aklınıza gelen, ne var ki her personel için SELECT TOP 2 * FROM XXX ORDER BY GIRIS_TARIHI DESC gibi bir sorgu yazar veririm dersiniz di mi? Bu örneği kafanızda iyice canlandırın. Bu sonucu nasıl çekebilirsiniz? Her personelin son 2 giriş tarihi... Eğer bizden istenen tek bir personelin son 2 giriş tarihi olsaydı işimiz gayet kolaydı. Araya bir WHERE koşulu koyup PERSONEL_ID = 123 vb olanı getir derdiniz ama yöneticiniz tüm personel listesini istiyor. CROSS APPLY olmadan mutlaka herkesin bir çözümü olacaktır ama hiçbir çözüm CROSS APPLY kadar verimli olmayacaktır. Ayrıca CROSS APPLY bu işi oldukça pratik ve hızlı çözüyor.

Basit düşünelim, 2 tane tablomuz olsun: PERSONEL ve PERSONEL_GIRIS diye 2 tane tablomuz olsun. PERSONEL tablosunda personel bilgileri, ID, Adı Soyadı gibi, PERSONEL_GIRIS tablosunda da bu personellerin giriş tarihleri tutuluyor olsun. Her bir personel için n tane giriş. Log tablosu gibi düşünelim bunu. Personellerin giriş logu tutulan bir tablo gibi düşünelim.

PERSONEL tablomuzda aşağıdaki gibi veriler olsun:





PERSONEL_GIRIS tablomuz da aşağıdaki gibi olsun:




Bu durumda her bir personelin son 2 giriş tarihi aşağıdaki sorguyla kolayca bulunabilir:



Yukardaki sorguya dikkat ederseniz; CROSS APPLY için yazılan kısımda WHERE PG.PERSONEL_ID = PERSONEL.ID eşleştirmesi yaptık. CROSS APPLY içindeki tablo ile dışardaki tablo PERSONEL_ID ile joinleniyor. Böylece doğru personel eşleşmesi yapılmış oluyor. Aynı ifadede CROSS APPLY yerine INNER JOIN olsaydı içerde TOP 2 çekmek isteyen ifadeyle böyle bir eşleşmeye izin vermeyecekti. CORSS APPLY ile INNER JOIN arasındaki temel fark burda.  Ayrıca LOG_TBL kullanımına dikkat ediniz.

Eğer ki son 2 giriş değil de son 1 giriş istenseydi, TOP 2 yerine TOP 1 diyecektik. Aradaki farkı görüp daha da anlaşılması açısından aşağıdaki sonucu da yazıyorum:


Görüleceği üzere sadece son girişler getirildi. Çoğu zaman CROSS APPLY sonucunu döndüren TABLE cinsinden function da yazılır. Bunun da yukardaki örneklerden hiçbir farkı yok, sadece CROSS APPLY içine yazılan sorgu bir function'a taşınmış olur o kadar. Bu örnekleri çoğaltabiliriz.

Umarım faydalı olabilmişimdir...




Paylaş:

5 yorum:

Bu Blogda Ara