В прошлой статье мы рассматривали использование подзапросов для получения списка клиентов. Однако, существует еще способ, как можно использовать подзапросы – для создания вычисляемых полей.
Предположим, необходимо вывести общее число заказов, сделанных каждым клиентом таблицы Customers (подробнее про БД смотрите в прошлой статье). Чтобы выполнить этот запрос потребуется сделать следующее:
- Извлечь список клиентов из таблицы Customers.
- Для каждого клиента подсчитать количество заказов в таблице Orders.
Для подсчета строк в таблице можно воспользоваться инструкцией SELECT COUNT(*)
, а через WHERE
фильтровать по конкретному клиенту. Попробуем для примера взять один cust_id.
SELECT COUNT(*) AS orders FROM Orders
WHERE cust_id = 1000000001
Для того, чтобы получить информацию через COUNT(*)
для каждого клиента, используем это выражение как подзапрос.
SELECT cust_name, cust_state, (
SELECT COUNT(*) FROM Orders
WHERE Orders.cust_id = Customers.cust_id
) AS orders
FROM Customers
WHERE orders > 0
ORDER BY cust_name
Инструкция возвращает 3 столбца – cust_name, cust_state и orders. Поле orders вычисляемое, оно сформировано в результате выполнения подзапроса. Подзапрос выполняется один раз для каждого клиента.
Предложение WHERE
в подзапросе были использованы полные имена столбцов. Это требуется, чтобы сравнивались значения cust_id из двух таблиц, так как такие названия есть в 2ух таблицах. Без использования полных имен СУБД будет считать, что мы сравниваем cust_id в таблице Orders с самим собой.
Несмотря на то, что запрос корректен, зачастую он оказывается не самым эффективным способом извлечения данных такого рода. В следующих статьях мы рассмотрим иные примеры.