Przechodzenie po hierarchii
Część sekcji Poza podstawami ścieżki SQL w Coddy. Lekcja 21 z 27.
Prawdziwy powód istnienia rekurencyjnych CTE: przechodzenie po relacji rodzic/dziecko zapisanej w jednej tabeli. Załóżmy, że tabela employees ma kolumnę manager_id, która wskazuje z powrotem na tę samą tabelę:
WITH RECURSIVE chain AS (
SELECT id, name, manager_id
FROM employees WHERE id = 7 -- początek: pracownik, od którego zaczynamy
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employees e
JOIN chain c ON e.id = c.manager_id -- rekurencja: przejdź do przełożonego
)
SELECT * FROM chainKażdy krok ponownie łączy CTE z employees, przechodząc o jeden poziom w górę drzewa. Rekurencja kończy się naturalnie, gdy wiersz nie ma menedżera (łączenie JOIN niczego nie dopasowuje).
Wyzwanie
ŚredniDostępne tabele i kolumny:
categories:id,name,parent_id
Każda kategoria ma opcjonalne parent_id wskazujące inną kategorię. Zwróć wszystkie kategorie będące potomkami kategorii id = 1 (jej dzieci, wnuki, …), ale nie samą kategorię 1. Zwróć id i name, posortowane według id.
Spróbuj swoich sił
WITH RECURSIVE descendants AS (
-- część początkowa: bezpośrednie dzieci id 1
-- część rekurencyjna: ich dzieci itd.
)
SELECT id, name FROM descendants ORDER BY id
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Poza podstawami
Poćwicz samodzielnie: Edytor online SQL