Как сочетать объединения и подзапросы
Вы уже знаете, что с таблицами, сформированными с помощью подзапросов, можно работать точно так же, как и с таблицами из базы данных.
Часто таблицы объединяют уже после того, как получили срез и сгруппировали данные. Причина проста: объединение больших таблиц занимает много времени. Таблицу лучше предварительно обработать, а уже потом объединять данные.
Готовим промежуточные таблицы
Покажем на примере. Нужно получить таблицу, в которую войдут пять стран — лидеров по количеству заказов. Для каждой страны будет отображено число зарегистрированных пользователей.
Необходимые данные хранятся в разных таблицах. Можно решить эту задачу объединением таблиц, но записей в них слишком много. Лучше начать с подзапросов.
Первый подзапрос отберёт пять стран с наибольшим количеством заказов.
SQL
Данные в таблице сгруппированы по стране. Таблица отсортирована по убыванию количества заказов и ограничена первыми пятью записями.
Теперь нужно сформировать вторую таблицу — посчитать число зарегистрированных пользователей на страну. Получать срез или сортировать данные не нужно. Отобрать данные можно после объединения.
SQL
Две таблицы сформированы. Можно их проанализировать:
- У таблиц есть общее поле со страной —
country. С помощью этого поля их можно объединить. - В итоговую таблицу должны войти не все страны, а только пять — с наибольшим числом заказов. Список этих стран находится в первой таблице, значит, эту таблицу можно назначить «левой» и применить
LEFT OUTER JOIN.
Осталось разобраться с тем, как объединить таблицы, сформированные подзапросами.
Объединяем результат подзапросов
Напомним правила объединения таблиц:
- После оператора
FROMназначают первую таблицу. - Затем следует оператор присоединения для выбранного типа —
LEFT OUTER JOIN. - После оператора указывают вторую таблицу и поля, по которым объединяют данные.
Теперь можно добавить подзапросы вместо таблиц.
SQL
Не забудьте назначить подзапросам псевдонимы, иначе код вызовет ошибку.
SQL
Таблицы объединены по полю
country. Тип присоединения — LEFT OUTER JOIN, поэтому в таблице остались данные только о пяти странах. Но таблицу нужно исправить: убрать лишнее поле country и добавить сортировку.SQL
Вместо того чтобы сначала объединять таблицы, а потом убирать лишнее, можно сформировать несколько подзапросов и объединить результаты.
Проверяем данные
Иногда при записи данных возникают ошибки. Проверим данные за 2010 год на корректность и помесячно сравним:
- сумму поля
totalиз таблицыinvoice, - произведение полей
unit_priceиquantityиз таблицыinvoice_line.
На первый взгляд, подзапросы не нужны и можно решить задачу с помощью присоединения. Однако, если присоединить таблицу
invoice к invoice_line, значения в поле total будут дублироваться. Ключевое слово DISTINCT не поможет: совпадающая стоимость разных заказов станет одним значением.Лучше использовать подзапросы, но сначала декомпозиция. Достаточно двух пунктов:
- найти сумму поля
total, - найти сумму произведения полей
unit_priceиquantity.
Напишем первый подзапрос:
SQL
Второй подзапрос немного сложнее — понадобится присоединить таблицу с подробностями о заказах:
SQL
Последний шаг — соединить таблицы по общему месяцу:
SQL
Задача решена: ошибок нет. Но проверить не помешает.