Вопрос : Что такое подзапросы (вложенные запросы, подвыборки), и где они используются?
Ответ: Подзапрос - это оператор SELECT, заключенный в круглые скобки и встроенный в тело другого запроса.
Подзапрос может использоваться в любых частях основного запроса.
Подзапросы также могут содержать подзапросы - под-подзапросы.
Подзапрос может выполняться либо один раз, вместе с выполнением основного запроса, либо для каждой записи основного запроса в отдельности. Выполнение подзапроса для каждой записи в отдельности существенно влияет на скорость выполнения запроса. Хотя план выполнения подзапроса не меняется в процессе выполнения основного запроса, тем не менее, следует избегать использования таких подзапросов для большого количества записей.
Создадим таблицу и посмотрим, как можно использовать подзапросы для выборки данных из нее. Созданная таблица будет содержать продажи по клиентам:
1. Подзапрос как колонка в основном запросе Создадим запрос, в котором наряду с информацией по продаже будет колонка, отображающая сумму продаж по каждому клиенту нарастающим итогом:
SELECT a.*,
(
select sum(Amount)
from Sales b
where b.ClientID=a.ClientID and b.Date<=a.Date
) AS SumAmount
FROM Sales a
GO
В этом запросе подзапрос использован для получения новой колонки и выполняется для каждой записи основного запроса.
Из-за того, что подзапрос выполняется для каждой записи, этот способ не является самым оптимальным. Более подробно вопрос получения суммы с нарастающим итогом мы рассмотрим в следующих выпусках рассылки.
2.Процент текущей продажи от общего объема продаж по клиенту Создадим запрос, в котором для каждой продажи вычислим ее процент от общего объема продаж по клиенту. Чтобы это сделать необходимо получить сумму продаж по каждому клиенту:
SELECT a.*,
b.Amount AS SumAmount,
(a.Amount*100/b.Amount) AS SalePercent
FROM Sales a
JOIN (
select ClientID, sum(Amount) as Amount
from Sales
group by ClientID
) b ON b.ClientID=a.ClientID
GO
В этом случае подзапрос опять выполняется для каждой записи основного запроса и возвращает даты двух последних продаж по текущему клиенту. Подзапрос используется в разделе WHERE.
Примечание: Эта выборка будет работать только в 2000-й версии SQL Server из-за использования оператора TOP.
Добавлю, что при работе в SQL Server 7.0 без установленных "сервиспаков" некоторые виды выборок с подзапросами выдают неверные результаты.
На этом закончим. Удалить созданные объекты можно с помощью следующего кода:
DROP TABLE Sales
GO
Надеюсь, Вы нашли эту информацию полезной. Вопросы, предложения и пожелания шлите на адрес sql@likor.ru
С уважением, Сергей Кошкин.
Адрес сайта Рассылки - http://sql.boom.ru/