Занятие 26. Табличные выражения
⚡ Кратко: дополнительная практика
- Продукты и количество заказанных единиц через CTE и подзапрос.
- Заказы после первого заказа клиента Lee.
- Продукты с максимальным target_level.
🏠 Дополнительная практика по материалам занятия
Проверить по документации: извлечённый HTML-источник LMS для этого занятия содержит страницу авторизации, а не текст задания. Ниже оставлена учебная практика по CTE; перед выдачей студентам сверить с актуальным заданием в LMS.
Все задания выполняются в базе northwind. Решите задачи с помощью CTE; где указано — сравните с подзапросом.
Задание 1. Продукты и количество заказанных единиц
Выведите названия продуктов из таблицы products, включая количество заказанных единиц quantity для каждого продукта из таблицы order_details.
Решите задачу двумя способами:
- с помощью CTE;
- с помощью подзапроса.
Решение через CTE
USE northwind;
WITH product_qty AS (
SELECT product_id, SUM(quantity) AS total_quantity
FROM order_details
GROUP BY product_id
)
SELECT p.product_name, COALESCE(pq.total_quantity, 0) AS total_quantity
FROM products AS p
LEFT JOIN product_qty AS pq ON p.id = pq.product_id;
Решение через подзапрос
USE northwind;
SELECT p.product_name,
COALESCE((SELECT SUM(od.quantity)
FROM order_details AS od
WHERE od.product_id = p.id), 0) AS total_quantity
FROM products AS p;
Задание 2. Заказы после первого заказа клиента Lee
Найдите все заказы из таблицы orders, сделанные после даты самого первого заказа клиента Lee из таблицы customers.
USE northwind;
WITH lee_first_order AS (
SELECT MIN(o.order_date) AS first_order_date
FROM orders AS o
JOIN customers AS c ON o.customer_id = c.id
WHERE c.last_name = 'Lee'
)
SELECT *
FROM orders
WHERE order_date > (SELECT first_order_date FROM lee_first_order);
Задание 3. Продукты с максимальным target_level
Найдите все продукты из таблицы products, у которых target_level равен максимальному значению target_level в таблице.
USE northwind;
WITH max_target AS (
SELECT MAX(target_level) AS max_level
FROM products
)
SELECT *
FROM products
WHERE target_level = (SELECT max_level FROM max_target);
Проверить по документации: точные имена столбцов в схеме northwind могут отличаться. Адаптируйте запрос под реальные названия таблиц и полей.