Перейти до основного вмісту
Модуль 14 · Урок 3 із 355/57 у курсі~18 min
Модульні уроки (3/3)

Рекурсивні CTE: дані у формі дерева

Рекурсивні CTE: дані у формі дерева

Тепер ми підходимо до справжньої надпотужності CTE. Бувають ситуації, коли дані мають нескінченно вкладені батьківські зв’язки (класичні категорії електронної комерції, упорядковані як MacBook > Computer > Electronics > Products). Простому SQL важко пройти ці ієрархії без циклів.

Рекурсивний CTE вирішує це, викликаючи сам себе, витягуючи батьківський/дочірній рівні, доки не «вичерпає» стек залежностей.

Як це побудовано

Вам потрібне ключове слово WITH RECURSIVE, і воно розбивається на 2 необхідні частини, розділені символом UNION ALL:

  1. Базовий випадок (запит, який витягує кореневий батьків або початковий елемент).
  2. Рекурсивний крок (запит, який приєднується до самого себе, щоб залучити дітей).
SQL
WITH RECURSIVE branch AS (
  -- Base case: find the top-level category that has no parent (parent_id IS NULL)
  SELECT id, name, parent_id, 1 AS depth
  FROM categories
  WHERE parent_id IS NULL

  UNION ALL

  -- Recursion: pulls in the children that point to parents found in the previous step
  SELECT c.id, c.name, c.parent_id, b.depth + 1
  FROM categories c
  JOIN branch b ON c.parent_id = b.id
)
SELECT * FROM branch ORDER BY depth;
вправи#sql.m14.l3.e1
Спроби: 0Завантаження…

Простежте базову ієрархію. Створіть рекурсивний CTE 'cat_tree'. Основний регістр: виберіть «id», «name» у таблиці «categories», де «parent_id IS NULL». Потім рекурсивно об’єднайте підкатегорії («категорії c»), приєднані до «cat_tree t» на «c.parent_id = t.id». Нарешті SELECT * FROM cat_tree.

Завантаження редактора…
Показати підказку

Використовуйте WITH RECURSIVE cat_tree AS (base_case UNION ALL recursive_case).

Рішення доступне після 3 спроб

вправи#sql.m14.l3.e2
Спроби: 0Завантаження…

Змініть cat_tree для обчислення поняття «рівень». Базовий випадок: додайте жорстко закодований параметр «1 AS depth» і включіть \`parent_id\` (id, name, parent_id, depth). Рекурсивний випадок: дочірні категорії збільшуватимуть глибину за допомогою 't.depth + 1'. Показати все, впорядковане за глибиною ASC.

Завантаження редактора…
Показати підказку

Додайте 't.depth + 1'. Запустіть остаточний SELECT із глибиною ORDER BY.

Рішення доступне після 3 спроб