Соединение результатов двух 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.