Поделиться через


Коррелированные вложенные запросы

Результат многих запросов может быть получен путем выполнения одного вложенного запроса и подстановки полученного результата или результатов в предложение WHERE внешнего запроса. В запросах, содержащих коррелированные вложенные запросы (также называемые повторяющимися вложенными запросами), вложенный запрос зависит по значению от внешнего запроса. Это означает, что выполнение вложенного запроса повторяется по одному разу для каждой строки, которая может быть выбрана внешним запросом.

Такой запрос получает по одному экземпляру для имени и фамилии каждого сотрудника, который в таблице SalesPerson имеет сумму премиальных, равную 5000, и для которого совпадают идентификационные номера сотрудника в таблицах Employee и SalesPerson.

USE AdventureWorks;
GO
SELECT DISTINCT c.LastName, c.FirstName, e.EmployeeID 
FROM Person.Contact AS c JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID 
WHERE 5000.00 IN
    (SELECT Bonus
     FROM Sales.SalesPerson sp
     WHERE e.EmployeeID = sp.SalesPersonID) ;
GO

Ниже приводится результирующий набор.

LastName FirstName EmployeeID

------------------------- ----------------- -----------

Ansman-Wolfe Pamela 280

Saraiva José 282

(Обработано строк: 2)

Предыдущий вложенный запрос данной инструкции не может быть выполнен независимо от внешнего запроса. Ему необходимо значение Employee.EmployeeID, но это значение изменяется каждый раз, когда SQL Server проверяет различные строки в таблице Employee.

Вот каким образом происходит выполнение этого запроса: SQL Server рассматривает каждую строку таблицы Employee для включения в результаты путем подстановки значения из нее во вложенный запрос. Например, если SQL Server сначала выполняет проверку строки для сотрудника Syed Abbas, переменная Employee.EmployeeID принимает значение 288, которое SQL Server и подставляет во вложенный запрос.

USE AdventureWorks;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE SalesPersonID = 288;

Результатом является 0 (Syed Abbas не получал премиальных, потому что не является менеджером по продажам), поэтому выполнение внешнего запроса приводит к следующему результату:

USE AdventureWorks;
GO
SELECT LastName, FirstName
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID 
WHERE 5000 IN (0.00);

Поскольку условие не выполнено, строка сотрудника Syed Abbas не включается в результат. То же самое действие выполняется со строкой для сотрудника Pamela Ansman-Wolfe. Из примера видно, что данная строка будет включена в результат.

Коррелированные вложенные запросы могут также включать в предложение FROM возвращающие табличное значение функции, указывая для них в качестве аргументов столбцы таблиц из внешнего запроса. В этом случае для каждой строки внешнего запроса выполняется возвращающая табличное значение функция, как и в случае с вложенным запросом.

См. также

Основные понятия