Rekurencyjne CTE dla hierarchii
Przechodź po danych hierarchicznych (strukturach organizacyjnych, komentarzach w wątkach, grafach) za pomocą WITH RECURSIVE i warunków zakończenia.
Rekurencyjne CTE dla hierarchii to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Po co rekurencja?
Standardowy SQL nie potrafi przechodzić po drzewie o nieznanej głębokości: po rodzicach rodziców ani dzieciach dzieci. Rekurencyjne CTE są standardowym rozwiązaniem SQL tego problemu.
Budowa
Rekurencyjne CTE składa się z dwóch części połączonych za pomocą UNION ALL:
WITH RECURSIVE name AS (
-- 1. Anchor query: seed rows
SELECT ...
UNION ALL
-- 2. Recursive step: references the CTE itself
SELECT ...
FROM name JOIN ...
)
SELECT * FROM name;Przechodzenie po strukturze organizacyjnej
Znajdź wszystkich pracowników podlegających bezpośrednio lub pośrednio danemu kierownikowi:
WITH RECURSIVE reports AS (
-- anchor: the manager themself
SELECT id, full_name, manager_id, 0 AS depth
FROM employees WHERE id = 42
UNION ALL
-- recurse: people whose manager is in reports
SELECT e.id, e.full_name, e.manager_id, r.depth + 1
FROM employees e
JOIN reports r ON r.id = e.manager_id
)
SELECT * FROM reports ORDER BY depth, full_name;Komentarze zagnieżdżone
Przejdź po drzewie dyskusji, zaczynając od korzenia:
WITH RECURSIVE thread AS (
SELECT id, parent_id, body, 0 AS depth, ARRAY[id] AS path
FROM comments WHERE id = $1
UNION ALL
SELECT c.id, c.parent_id, c.body, t.depth + 1, t.path || c.id
FROM comments c
JOIN thread t ON c.parent_id = t.id
)
SELECT * FROM thread ORDER BY path;Zakończenie
Rekurencja kończy się, gdy krok rekurencyjny nie zwraca żadnych nowych wierszy.
Unikanie nieskończonych pętli
Jeśli graf zawiera cykle, należy śledzić odwiedzone węzły:
WITH RECURSIVE walk AS (
SELECT id, ARRAY[id] AS path FROM nodes WHERE id = $1
UNION ALL
SELECT e.target_id, w.path || e.target_id
FROM edges e
JOIN walk w ON e.source_id = w.id
WHERE e.target_id <> ALL(w.path)
)
SELECT * FROM walk;Ciąg liczbowy
Rekurencyjne CTE mogą również generować sekwencje:
WITH RECURSIVE n(i) AS (
VALUES (1)
UNION ALL
SELECT i + 1 FROM n WHERE i < 100
)
SELECT i, i*i AS square FROM n;Struktura materiałowa
Rozwiń produkt na wszystkie komponenty, w tym podzespoły:
WITH RECURSIVE bom AS (
SELECT part_id, sub_part_id, qty FROM parts WHERE part_id = $1
UNION ALL
SELECT p.part_id, p.sub_part_id, p.qty * bom.qty
FROM parts p
JOIN bom ON bom.sub_part_id = p.part_id
)
SELECT sub_part_id, SUM(qty) AS total_qty FROM bom GROUP BY sub_part_id;Limity głębokości
Dla bezpieczeństwa należy ograniczyć głębokość rekurencji:
WITH RECURSIVE tree AS (
SELECT id, parent_id, 0 AS depth FROM nodes WHERE id = $1
UNION ALL
SELECT n.id, n.parent_id, t.depth + 1
FROM nodes n JOIN tree t ON n.parent_id = t.id
WHERE t.depth < 10
)
SELECT * FROM tree;UNION a UNION ALL
UNION ALL jest zwykle właściwym wyborem. UNION usuwa duplikaty — jest przydatny, gdy do węzła można dotrzeć na wiele sposobów.
Wydajność
Rekurencyjne CTE są obliczane iteracyjnie. Tabela robocza każdego kroku zawiera wiersze wytworzone przez poprzedni krok. Należy utworzyć indeksy dla kolumn używanych w złączeniach.
Podsumowanie
Rekurencyjne CTE służą do przechodzenia po hierarchiach i grafach.
- Część bazowa + UNION ALL + krok rekurencyjny
- Zatrzymują się, gdy krok rekurencyjny nie zwraca żadnych wierszy
- Do przerywania cykli należy używać tablicy ścieżki
Szybkie sprawdzenie
Jakie słowo kluczowe zmienia CTE w rekurencyjne CTE?
Często zadawane pytania
Czy lekcja „Rekurencyjne CTE dla hierarchii” jest bezpłatna?
Tak — pełny tekst „Rekurencyjne CTE dla hierarchii” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Rekurencyjne CTE dla hierarchii”?
Przechodź po danych hierarchicznych (strukturach organizacyjnych, komentarzach w wątkach, grafach) za pomocą WITH RECURSIVE i warunków zakończenia. Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Rekurencyjne CTE dla hierarchii”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podzapytania skalarne, wierszowe i tabelowe
- Podzapytania skorelowane i nieskorelowane
- Wspólne wyrażenia tabelowe (WITH)
- Rekurencyjne CTE dla hierarchii