Соединение результатов двух SQL SELECT: JOIN и CASE WHEN
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для объединения результатов двух запросов рекомендуется использовать Общее Табличное Выражение (CTE) и операцию JOIN:
WITH FirstCTE AS (
SELECT id, data FROM Table1
), SecondCTE AS (
SELECT id, info FROM Table2
)
SELECT FirstCTE.id, FirstCTE.data, SecondCTE.info
FROM FirstCTE
JOIN SecondCTE ON FirstCTE.id = SecondCTE.id;
Здесь ключевое слово WITH инициализирует CTE, после которого производится JOIN по столбцу id
.
Продвинутые способы объединения
Открыв новые грани логики SQL, вы сможете максимально эффективно реализовать операцию JOIN.
Применение left join
WITH PersonCTE AS (
SELECT person_id, task
FROM Persons
), TasksCTE AS (
SELECT person_id, COUNT(*) AS late_tasks
FROM Tasks
WHERE due_date < CURRENT_DATE -- Глядите, просрочены!
GROUP BY person_id
)
SELECT PersonCTE.person_id, PersonCTE.task, COALESCE(TasksCTE.late_tasks, 0) AS late_tasks_count
FROM PersonCTE
LEFT JOIN TasksCTE ON PersonCTE.person_id = TasksCTE.person_id;
Здесь LEFT JOIN дает возможность включить в выборку даже тех, кто не имеет просроченных задач. Функция COALESCE полезна для обработки значений NULL, появляющихся вследствие выполнения LEFT JOIN.
Агрегатные функции и условные операторы
...
SELECT person_id, COUNT(*) AS total_tasks, SUM(CASE WHEN due_date < NOW() THEN 1 ELSE 0 END) AS late_tasks
...
В данном случае мы выделаем статистику по общему числу задач и количество просроченных задач для каждого исполнителя. Функция COUNT(*) подсчитывает все задачи, а SUM(CASE WHEN...) учитывает лишь просроченные.
Решение сложных сценариев с применением JOIN
Когда задача становится сложнее, вы можете воспользоваться UNION ALL и дополнительными возможностями SQL:
UNION ALL для объединения результатов
Используйте UNION ALL, когда требуется представить полный набор данных:
SELECT id, data FROM Table1
UNION ALL
SELECT id, info FROM Table2;
Таким образом, вы получите всю выборку данных, включая повторные записи. Обратите внимание на соответствие количества и порядка столбцов и не забывайте использовать псевдонимы для унификации названий.
Применение условной логики в JOIN
...
LEFT JOIN CTE2 ON CTE1.id = CTE2.id AND CTE1.condition = CTE2.condition;
Введение дополнительных условий прямо в ON может коренным образом преобразить результат JOIN.
Визуализация
Вижуализируем процесс на простых примерах с кулинарными рецептами:
Первый рецепт (🍅): [Помидоры, Базилик, Соль]
Второй рецепт (🥑): [Авокадо, Лайм, Соль]
Объединение SQL-запросов аналогично смешиванию ингредиентов двух различных блюд:
🍅+🥑 = [Помидоры, Базилик, Авокадо, Лайм, Соль]
# В качестве результата мы получаем блюдо, состоящее из компонентов ОБЕИХ запросов.
Кто желает попробовать SQL-салат? 🥗
Сценарии из практики
Работая с SQL ежедневно, учитывайте следующие рекомендации:
Применение RIGHT или FULL OUTER JOIN
Если потребность требует включить все данные из правой таблицы, вам пригодится RIGHT JOIN, или FULL OUTER JOIN для абсолютного объединения данных:
-- RIGHT JOIN, важно не пропустить не единой детали!
RIGHT JOIN CTE2 ON CTE1.id = CTE2.id;
-- FULL OUTER JOIN, чтобы все данные были на месте
FULL OUTER JOIN CTE2 ON CTE1.id = CTE2.id;
Исключение дубликатов и сортировка результатов
Чтобы исключить дубликаты, используйте SELECT DISTINCT, а для упорядочивания данных — ORDER BY:
-- DISTINCT помогает избежать путаницы с дубликатами
SELECT DISTINCT CTE1.id, ...
-- ORDER BY обеспечивает упорядоченность результатов
... ORDER BY CTE1.id, CTE2.info;
Объединение информации из различных источников
Чтобы сопоставить данные из многих таблиц, используйте такой подход:
-- Пример объединения данных о продажах с информацией о товарах!
WITH SalesData AS (
SELECT transaction_id, amount FROM Sales
), ProductInfo AS (
SELECT product_id, product_name FROM Products
)
SELECT SD.transaction_id, SD.amount, PI.product_name
FROM SalesData SD
JOIN ProductInfo PI ON SD.product_id = PI.product_id;
Полезные материалы
- SQL UNION Operator — Изучите принципы объединения множества SELECT операторов с помощью SQL UNION.
- Can I Comma Delimit Multiple Rows Into One Column? – Stack Overflow — Обсуждение на Stack Overflow о том, как создавать представления с разделением запятыми.
- SQL: ALIASES — Инструкция по применению SQL-альясов в целях упрощения и оптимизации запросов.
- Using Temporary Tables in SQL Queries — Обзор применения временных таблиц в хранимых процедурах под SQL Server.