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

Пошаговый план для смены профессии

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

Открыв новые грани логики 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.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой оператор используется для объединения результатов двух SQL-запросов?
1 / 5
Свежие материалы