Вопрос проверяет понимание рекурсивных запросов SQL для построения древовидных структур из плоских данных.
Рекурсивный CTE (Common Table Expression) — это временный набор результатов, который ссылается сам на себя. Он состоит из двух частей: якорного запроса (anchor member), который выбирает корневые элементы, и рекурсивного запроса (recursive member), который присоединяет дочерние записи. Рекурсия продолжается, пока не будут обработаны все уровни.
Предположим, у нас есть таблица comments с полями id, parent_id и content. Чтобы получить все комментарии с указанием уровня вложенности, можно использовать следующий запрос:
WITH RECURSIVE comment_tree AS (
-- Якорный запрос: корневые комментарии (parent_id IS NULL)
SELECT id, parent_id, content, 1 AS level
FROM comments
WHERE parent_id IS NULL
UNION ALL
-- Рекурсивный запрос: присоединяем дочерние
SELECT c.id, c.parent_id, c.content, ct.level + 1
FROM comments c
INNER JOIN comment_tree ct ON c.parent_id = ct.id
)
SELECT * FROM comment_tree ORDER BY level, id;Этот запрос вернет все комментарии с уровнем вложенности, начиная с корневых (level=1) и до самых глубоких.
Рекурсивные CTE используются для работы с иерархическими данными: категории товаров, организационные структуры, комментарии, файловые системы. Они позволяют избежать множественных запросов в цикле и дают полную картину за один раз.
Используйте рекурсивный CTE, когда нужно получить все уровни древовидной структуры из таблицы с parent-child связями. Это стандартный и производительный подход в SQL для таких задач.