Bir tabloyu aynı sorguda birden fazla okumamız gerektiğinde, yani recursive erişim gerektiğinde CTE çok kullanışlı olmaktadır.
Örneğin bir Menu tablonuz olsun. Aynı tabloda ana menu ve alt menuler aşağıdaki gibi tutuluyor olsun;
CREATE TABLE Menu(
ID INT,
Aciklama VARCHAR(50),
AnaMenuID INT
)
Bu tablonun verileri aşağıdaki gibi olsun;
ID Aciklama AnaMenuID
1 Raporlar 0
2 Alt Rapor1 1
3 Alt Rapor2 1
4 Alt Rapor3 1
5 İşlemler 0
6 Alt İşlem1 5
7 Alt İşlem2 5
8 Alt İşlem3 5
9 Alt İşlem4 5
Biz menu ismini ve ana menü ismini aynı satırda listelemek istersek bu tabloya recursive erişmemiz gerekecek ve bunun için CTE yi aşağıdaki gibi kullanabiliriz;
WITH tempMenuList AS -- Menu tablosu belleğe alınarak temp tablo oluşturulur
(
SELECT * FROM Menu WITH(NOLOCK)
)
-- Buradan sonrasında tempMenuList tablosunu istediğimiz gibi kullanabiliriz. Sadece SELECT
-- değil çeşitli ihtiyaçlarda UPDATE, DELETE, INSERT komutları da kullanılabilir.
SELECT M1.ID, M1.Aciklama, ISNULL(M2.Aciklama, '') 'AnaMenuAciklama'
FROM tempMenuList M1
LEFT JOIN tempMenuList M2 ON (M2.ID = M1.AnaMenuID)
CTE, sorgu sonucundan gelen verileri(bu örneğimizde Menu tablosunu) belleğe alarak recursive erişimde performansı artırmaktadır.
Hiç yorum yok:
Yorum Gönder