Menu
Coddy logo textTech

Hiyerarşi Üzerinde Gezinme

Coddy'nin SQL Journey'sinin Temellerin Ötesi bölümünün bir parçası — ders 21 / 27.

Özyinelemeli (recursive) CTE'lerin var olmasının asıl nedeni: tek bir tabloda saklanan ebeveyn/çocuk ilişkisi üzerinde gezinmektir. Diyelim ki employees tablosunun, aynı tabloya geri işaret eden bir manager_id sütunu var:

WITH RECURSIVE chain AS (
    SELECT id, name, manager_id
    FROM employees WHERE id = 7              -- anchor: başlangıç çalışanı
    UNION ALL
    SELECT e.id, e.name, e.manager_id
    FROM employees e
    JOIN chain c ON e.id = c.manager_id      -- recursive: yöneticiye atla
)
SELECT * FROM chain

Her adım, ağaçta bir seviye yukarı atlayarak CTE'yi tekrar employees tablosuna bağlar. Bir satırın yöneticisi olmadığında (JOIN hiçbir şeyle eşleşmediğinde) özyineleme doğal olarak durur.

challenge icon

Görev

Orta

Mevcut tablolar ve sütunlar:

  • <strong>categories</strong>: <strong>id</strong>, <strong>name</strong>, <strong>parent_id</strong>

Her kategorinin, başka bir kategoriyi işaret eden isteğe bağlı bir parent_id değeri vardır. Kategori id = 1'in alt dalları olan (çocukları, torunları, …) ancak kategori 1'in kendisi olmayan tüm kategorileri döndürün. id ve name sütunlarını döndürün, id sütununa göre sıralayın.

Kopya kağıdı

Tek bir tabloda saklanan (örneğin, aynı tabloyu işaret eden bir manager_id veya parent_id sütunu) üst/alt ilişkilerini gezmek için özyinelemeli (recursive) CTE'ler kullanın:

WITH RECURSIVE chain AS (
    SELECT id, name, manager_id
    FROM employees WHERE id = 7          -- anchor: başlangıç satırı
    UNION ALL
    SELECT e.id, e.name, e.manager_id
    FROM employees e
    JOIN chain c ON e.id = c.manager_id  -- recursive: üst öğeye geç
)
SELECT * FROM chain

Özyineleme, JOIN eşleşen satır bulamadığında (örneğin, yöneticisi olmayan bir satır) doğal olarak durur.

Kendin dene

WITH RECURSIVE descendants AS (
    -- anchor: id 1'in doğrudan çocukları
    -- recursive: onların çocukları, vb.
)
SELECT id, name FROM descendants ORDER BY id
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temellerin Ötesi bölümündeki tüm dersler