Коррелированные вложенные запросы
Результат многих запросов может быть получен путем выполнения одного вложенного запроса и подстановки полученного результата или результатов в предложение WHERE внешнего запроса. В запросах, содержащих коррелированные вложенные запросы (также называемые повторяющимися вложенными запросами), вложенный запрос зависит по значению от внешнего запроса. Это означает, что выполнение вложенного запроса повторяется по одному разу для каждой строки, которая может быть выбрана внешним запросом.
Такой запрос получает по одному экземпляру для имени и фамилии каждого сотрудника, который в таблице SalesPerson имеет сумму премиальных, равную 5000, и для которого совпадают идентификационные номера сотрудника в таблицах Employee и SalesPerson.
USE AdventureWorks2008R2;
GO
SELECT DISTINCT c.LastName, c.FirstName, e.BusinessEntityID
FROM Person.Person AS c JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID
WHERE 5000.00 IN
(SELECT Bonus
FROM Sales.SalesPerson sp
WHERE e.BusinessEntityID = sp.BusinessEntityID) ;
GO
Ниже приводится результирующий набор.
LastName FirstName BusinessEntityID
-------------------------- ---------- ------------
Ansman-Wolfe Pamela 280
Saraiva Jose 282
(Обработано строк: 2)
Предыдущий вложенный запрос данной инструкции не может быть выполнен независимо от внешнего запроса. В нем необходимо указать значение Employee.BusinessEntityID, однако это значение изменяется каждый раз, когда SQL Server проверяет различные строки в таблице Employee.
Вот каким образом происходит выполнение этого запроса: SQL Server рассматривает каждую строку таблицы Employee для включения в результаты путем подстановки значения из нее во вложенный запрос. Например, если SQL Server сначала выполняет проверку строки для сотрудника Syed Abbas, переменная Employee.BusinessEntityID принимает значение 285, которое SQL Server и подставляет во вложенный запрос.
USE AdventureWorks2008R2;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE BusinessEntityID = 285;
Результатом является 0 (Syed Abbas не получал премиальных, потому что не является менеджером по продажам), поэтому выполнение внешнего запроса приводит к следующему результату:
USE AdventureWorks2008R2;
GO
SELECT LastName, FirstName
FROM Person.Person AS c JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID
WHERE 5000 IN (0.00)
Поскольку условие не выполнено, строка сотрудника Syed Abbas не включается в результат. То же самое действие выполняется со строкой для сотрудника Pamela Ansman-Wolfe. Из примера видно, что данная строка будет включена в результат.
Коррелированные вложенные запросы могут также включать в предложение FROM возвращающие табличное значение функции, указывая для них в качестве аргументов столбцы таблиц из внешнего запроса. В этом случае для каждой строки внешнего запроса выполняется возвращающая табличное значение функция, как и в случае с вложенным запросом.