🔍 Что такое CTE?
CTE (WITH выражение) — это временный набор данных, определённый перед основным SQL-запросом.
🧹 Зачем использовать CTE с DELETE?
Упрощает чтение и понимание кода при сложных условиях.
Позволяет использовать JOIN, ROW_NUMBER() и другие функции перед удалением.
Избавляет от подзапросов в WHERE, которые иногда трудно читать.
📌 Пример: Удалить дубликаты по email, оставив только один
WITH duplicates AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users
WHERE id IN (
SELECT id FROM duplicates WHERE rn > 1
);
🧠 Здесь:
CTE duplicates присваивает каждой строке номер внутри группы одинаковых email.
Удаляем все строки, где rn > 1 — то есть дубликаты.
📌 Пример: Удаление с JOIN
WITH to_delete AS (
SELECT u.id
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'cancelled'
)
DELETE FROM users
WHERE id IN (SELECT id FROM to_delete);
📌 Поддержка:
Работает в PostgreSQL, SQL Server, Oracle (с USING или WITH).
В MySQL с 8.0+ CTE поддерживаются, но DELETE с CTE может потребовать подзапрос.