Модульні уроки (3/3)
Рекурсивні CTE: дані у формі дерева
Рекурсивні CTE: дані у формі дерева
Тепер ми підходимо до справжньої надпотужності CTE. Бувають ситуації, коли дані мають нескінченно вкладені батьківські зв’язки (класичні категорії електронної комерції, упорядковані як MacBook > Computer > Electronics > Products).
Простому SQL важко пройти ці ієрархії без циклів.
Рекурсивний CTE вирішує це, викликаючи сам себе, витягуючи батьківський/дочірній рівні, доки не «вичерпає» стек залежностей.
Як це побудовано
Вам потрібне ключове слово WITH RECURSIVE, і воно розбивається на 2 необхідні частини, розділені символом UNION ALL:
- Базовий випадок (запит, який витягує кореневий батьків або початковий елемент).
- Рекурсивний крок (запит, який приєднується до самого себе, щоб залучити дітей).
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;Простежте базову ієрархію. Створіть рекурсивний 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 спроб
Змініть cat_tree для обчислення поняття «рівень». Базовий випадок: додайте жорстко закодований параметр «1 AS depth» і включіть \`parent_id\` (id, name, parent_id, depth). Рекурсивний випадок: дочірні категорії збільшуватимуть глибину за допомогою 't.depth + 1'. Показати все, впорядковане за глибиною ASC.
Показати підказку
Додайте 't.depth + 1'. Запустіть остаточний SELECT із глибиною ORDER BY.
Рішення доступне після 3 спроб