EMZETT.
Giriş yap

Ö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 ALL ve 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