Обобщенное табличное выражение

Что такое обобщенное табличное выражение: определение, основные принципы, примеры и практические советы. Изучайте SQL для тестировщиков с подробными объяснениями для начинающих специалистов.

Обобщенное табличное выражение.

WITH — Обобщённое табличное выражение или CTE (Common Table Expressions), это временный результирующий набор данных, к которому можно обращаться в последующих запросах.

WITH название_cte [(столбец_1 [, столбец_2] ...)] AS (подзапрос)
[, название_cte [(столбец_1 [, столбец_2] ...)] AS (подзапрос)]

Практические примеры:

-- Простое CTE - пользователи с заказами
WITH user_orders AS (
    SELECT user_id, COUNT(*) as order_count
    FROM orders
    GROUP BY user_id
)
SELECT u.username, uo.order_count
FROM users u
JOIN user_orders uo ON u.id = uo.user_id;

-- Множественные CTE - статистика по категориям
WITH category_stats AS (
    SELECT category, AVG(price) as avg_price
    FROM products
    GROUP BY category
),
expensive_categories AS (
    SELECT category
    FROM category_stats
    WHERE avg_price > 100
)
SELECT * FROM expensive_categories;

-- Рекурсивное CTE - иерархия категорий
WITH RECURSIVE category_tree AS (
    SELECT id, name, parent_id, 1 as level
    FROM categories
    WHERE parent_id IS NULL

    UNION ALL

    SELECT c.id, c.name, c.parent_id, ct.level + 1
    FROM categories c
    JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT * FROM category_tree;

-- CTE с обновлением - временная таблица для анализа
WITH temp_analysis AS (
    SELECT user_id, SUM(total_amount) as total_spent
    FROM orders
    WHERE order_date >= '2024-01-01'
    GROUP BY user_id
)
UPDATE users u
SET status = 'premium'
WHERE u.id IN (
    SELECT user_id FROM temp_analysis
    WHERE total_spent > 1000
);