Вопрос проверяет понимание CTE (Common Table Expressions) в PostgreSQL и их применения для упрощения сложных запросов.
Ключевое слово WITH в PostgreSQL используется для определения Common Table Expression (CTE) — временного именованного набора результатов, который существует только в рамках выполнения одного запроса. CTE делает сложные запросы более читаемыми, модульными и легкими для отладки.
CTE особенно полезны в следующих случаях:
Предположим, у нас есть таблица employees с полями id, name и manager_id. Мы хотим получить всех сотрудников, которые подчиняются определенному менеджеру, включая всю цепочку подчинения.
WITH RECURSIVE employee_tree AS (
SELECT id, name, manager_id, 1 AS level
FROM employees
WHERE manager_id = 1 -- начальный менеджер
UNION ALL
SELECT e.id, e.name, e.manager_id, et.level + 1
FROM employees e
INNER JOIN employee_tree et ON e.manager_id = et.id
)
SELECT * FROM employee_tree;В этом примере WITH RECURSIVE позволяет рекурсивно обходить иерархию, начиная с менеджера с id = 1, и собирать всех подчиненных на всех уровнях.
Используйте WITH (CTE) в PostgreSQL, когда вам нужно улучшить читаемость и поддерживаемость сложных SQL-запросов, особенно при работе с рекурсивными структурами данных или многократным использованием одного и того же подзапроса.