İleri Seviye SQL: CTE ile Hiyerarşik/Ağaç Yapılarda Çalışmak
# SQL’de CTE ile Hiyerarşik/Ağaç Yapılarda Çalışmak
Genellikle parent/child ilişkili verilerin ağaç yapısındaki üst veya alt nodelara erişmek için belli başlı algoritmalar kurmak zorunda kalabiliyoruz. Ancak ilgili node için alt ve üst nodelara SQL’deki CTE ile ulaşmak aslında çok kolay.
ID/ParentID ilişkisi bulunan bir tabloda belli bir kaydın üst veya alt nodelarına erişebilmek için son kayda ulaşana kadar kaç defa üste veya kaç defa alta gidileceği bilinmez. Bu tarz durumlar için recursive sorgulama ile koşullarımızı belirterek bu koşula uymayana kadar çalışması sağlanabilir.
Peki, nedir bu CTE? : İleri Seviye SQL : CTE (Common Table Expressions)
Dipnot: CTE ile recursive işlemler çerçevesinde yaptığımız her sorgu “başlama noktasındaki satır sayısı” + “100 biriktirme satırı” ile sınırlıdır. Bu limit aşıldığında SQL hata verecektir. Varsayılan limiti kaldırmak için, sorgunun en sonuna “OPTION (MAXRECURSION 0)” ifadesini eklemek gerekmektedir.
# Yeni Bir Veritabanı ve Tablo Yapısının Oluşturulması
Kodları uyguladıktan sonra:
- CTE_Categories isminde veritabanını,
- dbo.Categories tablosunu,
- dbo.Categories tablosuna, 10 adet kayıt oluşacak.
INSERT kod bloğunda, hiyerarşinin bakıldığında anlaşılabilmesi için girdilere dikkat ederek hazırladım.
# Örnek Bir Sorgulama ile Verilerin Kontrol Edilmesi
Veritabanını ve tabloyu oluşturduk. İlgili test kayıtlarını oluşturduk. Peki, gerçekten başarılı bir şekilde bu işlemleri gerçekleştirebildik mi ? Ufak bir select sorgusu ile test edelim.
Sonuçlar sizde de aynı ise, şu ana kadar ki tüm işlemler başarılı bir şekilde gerçekleşmiştir.
# Child Nodelara Ulaşmak
Senaryoya göre; Frontend kategorisine bağlı olan tüm alt kayıtlara ulaşılması bekleniyor. Peki, CTE ile nasıl bir sorgu hazırlamak gerekir?
Aşağıdaki sorgu Frontend kategorisine ait tüm child kayıtları getirecektir.
Biraz sorgudan bahsetmek gerekirse;
UNION ALLdan önceki sorgu, başlama noktası olarak düşünebilir. Yani Frontend kategorisinin bulunduğu satır.
UNION ALLdan sonraki sorgu biriktirme noktası olarak düşünebilir. Yani Frontend kategorisinin altındaki tüm satırları kapsar. Biriktirme noktasındaki JOIN amaç ise ne kadar alt nodea ulaşılacağı bilinmediği için ilgili ParentID var olduğu sürece devam etmesini sağlayarak biriktirme işlemini gerçekleştiririz.
Level ve Breadcrumb sütunları ihtiyaca yönelik kullanım içindir.
Sonuç ise aşağıdaki gibi olacaktır;
# Parent Nodelara Ulaşmak
Senaryoya göre, AngularJS kategorisinin üstünde olan tüm kayıtlara ulaşılması isteniyor. CTE ile nasıl bir sorgu hazırlamak gerekir?
Aşağıdaki sorguda örnek olarak AngularJS kategorisine ait tüm üst kayıtları getirecektir.
Sonuç ise aşağıdaki gibi olacaktır;
# Kazanımlar
- CTE’nin tek bir DML ifadesi süresince var olduğunu ve genellikle recursive işlemlerde kullanıldığını,
- View, temp table ve table-value constructora benzediğini ve alanların deklare edilmemesi gerektiğini,
- Birden fazla CTE ifadesi kullanılabildiğini,
- Recursive işlemlerde satır limitinin olduğunu,
- CTE’nin Hiyerarşik/Ağaç yapılarında, alt ve üst nodelara kolayca ulaşılabilmesini sağladığını öğrenmiş olduk.
# Sosyal Medya Hesaplarım
- LinkedIn: Karcan Ozbal | LinkedIn
- Github: karcan (Karcan Ozbal) (github.com)
- Patreon: Karcan is creating little extensions for make your life funny :)
Konu istekleri ve makale ile ilgili tartışmak için yoruma bekliyorum.