0Pricing
SQL Academy · Lekcja

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

  1. Podzapytania skalarne, wierszowe i tabelowe
  2. Podzapytania skorelowane i nieskorelowane
  3. Wspólne wyrażenia tabelowe (WITH)
  4. Rekurencyjne CTE dla hierarchii
← Powrót do SQL Academy