Özyinelemeli CTE’ler: SQL’de ağaçlar ve hiyerarşiler
Kısaca: Özyinelemeli bir CTE (“common table expression”), SQL’de kendini çağırır ve böylece kategoriler, organizasyon şemaları veya forum konularındaki yanıtlar gibi ağaçları ve hiyerarşileri dolaşır.
Biraz daha ayrıntılı: Normal sorgular sabit sayıda birleştirme (join) bilir. Hiyerarşilerin derinliği bilinmez. Özyinelemeli CTE, yeni bir şey eklenmeyene dek bir adımı yineler.
Ayrıntılı
- Yapı: Bir başlangıç kısmı (anchor),
UNION ALLve CTE’nin kendisine başvuran özyinelemeli bir kısım.
WITH RECURSIVE agac AS (
SELECT id, ad, ust_id, 0 AS derinlik
FROM kategori WHERE ust_id IS NULL
UNION ALL
SELECT k.id, k.ad, k.ust_id, a.derinlik + 1
FROM kategori k JOIN agac a ON k.ust_id = a.id
)
SELECT * FROM agac ORDER BY derinlik;- Akış: Anchor kökleri verir, özyinelemeli kısım en son bulunan satırların çocuklarını getirir.
- Sonsuz döngüden koruma: Döngülerde (A → B → A) ziyaret edilen düğümleri hatırlamak veya derinliği sınırlamak gerekir.
- Başka kullanımlar: Sayı dizileri üretme, grafiklerde yol arama, malzeme listelerini çözme.
- Alternatifler: Yolu içeren bir sütun (“materialized path”), iç içe kümeler (nested sets), PostgreSQL’de
ltree.
Ayrıca bak: SQL pencere işlevleri