Keçən məqalədə alt sorğular və onların növləri barəsində məlumat vermişdik. Bu dəfəki məqalə  isə alt sorğular ilə bənzər xüsusiyyətlərə malik, lakin bir o qədər üstünlükləri olan Ümumi Cədvəl İfadələri barəsində olacaqdır. CTE-lər hər hansı mürəkkəb sorğunun çağırılması zamanı əldə olunan müvəqqəti nəticələrin bir və ya bir neçə dəfə istifadəsini təmin edən ifadələrdir. Digər SQL obyektləri kimi yaddaşda yer tutmur və yalnız sorğunun icrası zamanı istifadə olunur. Xüsusilə, mürəkkəb sorğular yazılarkən bəzən müəyyən kod sətirlərini birdən çox yerdə yenidən istifadə etmək lazım gəlir və bu da sorğunun yazılışını daha da kompleks formaya salır. CTE-lər vasitəsi ilə təkrar istifadə ediləcək kod bloklarını sanki yeni bir cədvəlmiş kimi çağıra və sorğumuzu sadələşdirə bilərik.

CTE-nin quruluşu WİTH açar sözü ilə başlayır. Daha sonra cədvəl ifadənizə müvafiq ad verməlisiniz. Aşağıdakı sintaksis CTE formasını əks etdirir.

SELECT, İNSERT, UPDATE, DELETE, CREATE  komandaları və VİEW obyekti ilə işlədilir. Ümumi cədvəl ifadələri barəsində bilməli olduğumuz xüsusiyyətlər:

  • Oxunaqlılıq - qeyd etdiyimiz kimi, cte istifadəsi skriptin oxunaqlılığını asanlaşdırır.
  • VİEW obyekti əvəzləmə - əgər view obyekti yaratmağa səlahiyyətiniz yoxdursa və ya davamlı olaraq sorğu nəticəsini istifadə etməyəcəksinizsə, view obyekti yaratmaq əvəzinə cte işlətmək daha əlverişlidir. Həmçinin, metadata-da view depolamağa ehtiyac da yaranmır.
  • Rekursiya – CTE-nin ən böyük avantajı rekursiv xüsusiyyət daşıya bilməsidir. Bu haqda irəli hissələrdə məlumat veriləcəkdir.

CTE-lər funksionallığına görə 2 qrupa bölünür: rekursiv olmayan və rekursiv olan cte-lər.

İlk öncə rekursiya nədir? Rekursiya (recursio- latın sözü olub, tərcüməsi qayıtmaq mənasını verir) proqramın və ya funksiyanın özü-özünə müraciət etməsi başa düşülür.

 

  • Rekursiv olmayan CTE-lər

Adından da başa düşüldüyü kimi, bu tip CTE daxilində hər hansı özünə müraciət prosesi baş vermir, sadə quruluşa malikdirlər. Məsələn, bir şirkət daxilində satış nümayəndələrinin fərqli illərdə həyata keçirdikləri satış miqdarlarını ekrana çıxarmaq istəyirik.

Gəlin, sorğunu incələyək. İlk olaraq, cte_satis_miqdarı ümumi cədvəl ifadəsini təyin etdik və 3 sütunu input parameter olaraq daxil etdik. CTE daxilində SELECT əmri ilə 3 fərqli cədvəldən uyğun datanı çəkdik. Sonda isə 2017-ci il şərtini qoyaraq CTE-yə müraciət edib nəticəni əldə edirik.

  • Rekursiv olan CTE-lər

Rekursiv CTE-lər sorğu daxilində öz-özünə müraciət edərək dəfələrlə icra olunur. İyerarxik şəkildə təşkil olunmuş verilənlərlə işləyərkən rekursiv sorğulara müraciət olunur. Məsələn, işçi heyəti databazasından işçi id-sinə əsasən onun menejerini, menejerinin menejerini və s. çıxartmaq istəyirik. Bir qurumda bütün işçilər müəyyən rəhbərlərə tabe olurlar və bu iyerarxik quruluşu formalaşdırır.

Yuxarıda qeyd olunmuş sorğuda ilk SELECT komandının icra etdiyi hissə “anchor member”, ikinci hissə (CTE-nin özünə referans olduğu hissə) isə “recursive member” olaraq adlandırılır. Bu iki üzvü bir-birinə UNİON ALL operatoru bağlayır.

Nəticəyə əsasən, aşağıdakı Menejer-İşçilər databazasını iyeraxik formada əldə etmiş oluruq.

 

Ümumi cədvəl ifadələri (CTE) və Alt sorğular arasında fərqlər nələrdir?

Ümumi baxış atsaq, hər ikisinin bənzər cəhətləri çoxdur, məsələn, hər ikisi sorğunun icrası zamanı yaranır və yalnız lokal skriptdə çalışır. Lakin CTE-lərin alt sorğularda mövcud olmayan imkanları var. Bu limitlərdən ilki

  • CTE-lər vasitəsi ilə skalyar alt sorğular nəticəsində əldə olunmuş sütunları GROUP BY funksiyası ilə qruplaşdırmaq mümkündür.

Məsələn, tutaq ki, öyrənmək istəyirik ki, eyni sayda işçisi olan neçə fərqli departamentimiz var.

NumberEmployees sütunu alt sorğunun qaytardığı dəyərlər əsasında formalaşır, yəni hər hansı cədvəldə yerləşmir. Əgər alt sorğudan istifadə etmiş olsaydıq,

qarşılaşacağımız xəta:

Lakin CTE bu cür skalyar alt sorğular nəticəsində əldə olunmuş sütunları da “valid” sütun olaraq tanıyır və GROUP BY edərkən xəta çıxarmır.

Nəticəmizə görə, 1 işçisi olan 3 departament, 2 işçisi olan 2 departament, 7 işçisi olan 1 departament və s. var.

  • Növbəti üstünlük isə CTE-lər sıralama və ya sətirləri yenidən nömrələmə, yəni “Ranking Functions” məsələn, RANK() və ya NTİLE() ilə işləyə bilir.

Bir sorğu daxilində icra olunan bir neçə CTE-lər

Bir neçə CTE eyni zamanda yaratmaq istədikdə sadəcə ilk CTE-nin əvvəlinə WITH  yazmaq kafidir. Keys üzərindən təhlil edək. Kateqoriyalar və onlara daxil olan məhsul sayı və həmin kateqoriyalara aid məhsulların satışlarını çıxarmaq istəyirik. Kateqoriyalara aid olan məhsulları saymaq üçün ayrıca, həmin kateqoriya üzrə edilmiş satış sayını çıxarmaq üçün ayrıca CTE yazılmalıdır.

Ümumi cədvəl ifadələrini əhatə edən məqaləmin sizlərə fayda verəcəyini ümid edirəm 

Vaxt ayırıb oxuduğunuz üçün minnətdaram!

Növbəti məqalələrdə görüşmək üzərə!