> Как написать запрос с использованием CTE в SQL (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Нетология

Стек: Go

> Пример ответа

CTE (Common Table Expression) - это временный именованный набор результатов, который можно использовать внутри основного SQL-запроса. Он упрощает чтение и поддержку сложных запросов, особенно при работе с иерархическими данными или многократным использованием одного подзапроса.

Пример: допустим, у нас есть таблица orders (заказы) и нужно найти клиентов, чья сумма заказов превышает 1000. Без CTE пришлось бы писать вложенный запрос, а с CTE код становится чище:

SQL
WITH high_value_customers AS (
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000
)
SELECT c.name, h.total_spent
FROM customers c
JOIN high_value_customers h ON c.id = h.customer_id;

В Go (например, с использованием database/sql и драйвера PostgreSQL) такой запрос выполняется как обычный Query:

GO
rows, err := db.Query(`
WITH high_value_customers AS (
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000
)
SELECT c.name, h.total_spent
FROM customers c
JOIN high_value_customers h ON c.id = h.customer_id
`)

CTE также поддерживает рекурсию (ключевое слово RECURSIVE), что полезно для обхода деревьев или графов, например, структуры категорий.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью