Соединение результатов двух SQL SELECT: JOIN и CASE WHEN

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для объединения результатов двух запросов рекомендуется использовать Общее Табличное Выражение (CTE) и операцию JOIN:

SQL
Скопировать код
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.

Кинга Идем в IT: пошаговый план для смены профессии

Продвинутые способы объединения

Открыв новые грани логики SQL, вы сможете максимально эффективно реализовать операцию JOIN.

Применение left join

SQL
Скопировать код
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.

Агрегатные функции и условные операторы

SQL
Скопировать код
...
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, когда требуется представить полный набор данных:

SQL
Скопировать код
SELECT id, data FROM Table1
UNION ALL
SELECT id, info FROM Table2;

Таким образом, вы получите всю выборку данных, включая повторные записи. Обратите внимание на соответствие количества и порядка столбцов и не забывайте использовать псевдонимы для унификации названий.

Применение условной логики в JOIN

SQL
Скопировать код
...
LEFT JOIN CTE2 ON CTE1.id = CTE2.id AND CTE1.condition = CTE2.condition;

Введение дополнительных условий прямо в ON может коренным образом преобразить результат JOIN.

Визуализация

Вижуализируем процесс на простых примерах с кулинарными рецептами:

Markdown
Скопировать код
Первый рецепт (🍅): [Помидоры, Базилик, Соль]
Второй рецепт (🥑): [Авокадо, Лайм, Соль]

Объединение SQL-запросов аналогично смешиванию ингредиентов двух различных блюд:

Markdown
Скопировать код
🍅+🥑 = [Помидоры, Базилик, Авокадо, Лайм, Соль]
# В качестве результата мы получаем блюдо, состоящее из компонентов ОБЕИХ запросов.

Кто желает попробовать SQL-салат? 🥗

Сценарии из практики

Работая с SQL ежедневно, учитывайте следующие рекомендации:

Применение RIGHT или FULL OUTER JOIN

Если потребность требует включить все данные из правой таблицы, вам пригодится RIGHT JOIN, или FULL OUTER JOIN для абсолютного объединения данных:

SQL
Скопировать код
-- 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:

SQL
Скопировать код
-- DISTINCT помогает избежать путаницы с дубликатами
SELECT DISTINCT CTE1.id, ... 

-- ORDER BY обеспечивает упорядоченность результатов
... ORDER BY CTE1.id, CTE2.info;

Объединение информации из различных источников

Чтобы сопоставить данные из многих таблиц, используйте такой подход:

SQL
Скопировать код
-- Пример объединения данных о продажах с информацией о товарах!
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;

Полезные материалы

  1. SQL UNION Operator — Изучите принципы объединения множества SELECT операторов с помощью SQL UNION.
  2. Can I Comma Delimit Multiple Rows Into One Column? – Stack Overflow — Обсуждение на Stack Overflow о том, как создавать представления с разделением запятыми.
  3. SQL: ALIASES — Инструкция по применению SQL-альясов в целях упрощения и оптимизации запросов.
  4. Using Temporary Tables in SQL Queries — Обзор применения временных таблиц в хранимых процедурах под SQL Server.