Subconsultas correlacionadas

Muitas consultas podem ser avaliadas pela execução de uma subconsulta, uma vez, e pela substituição do valor ou dos valores resultantes na cláusula WHERE da consulta externa. Em consultas que incluem uma subconsulta correlacionada (também conhecida como uma subconsulta repetitiva), a subconsulta depende da consulta externa para obter seus valores. Isso significa que a subconsulta é executada repetidamente, uma vez para cada linha que pode ser selecionada pela consulta externa.

Essa consulta recupera uma instância do nome e sobrenome de cada funcionário para o qual o bônus da tabela SalesPerson seja 5.000, e para o qual existam números de identificação de funcionário correspondentes nas tabelas Employee e 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

Conjunto de resultados.

LastName FirstName EmployeeID

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

Ansman-Wolfe Pamela 280

Saraiva José 282

(2 row(s) affected)

A subconsulta anterior dessa instrução não pode ser avaliada independentemente da consulta externa. É necessário um valor para Employee.EmployeeID, mas esse valor é alterado à medida que o SQL Server examina diferentes linhas em Employee.

Essa é exatamente a forma pela qual a consulta é avaliada: o SQL Server considera cada linha da tabela Employee para inclusão nos resultados, substituindo o valor de cada uma das linhas na consulta interna. Por exemplo, se o SQL Server examinar primeiramente a linha de Syed Abbas, a variável Employee.EmployeeID ficará com o valor 288, que o SQL Server substituirá na consulta interna.

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

O resultado é 0 (Syed Abbas não recebeu bônus porque não é vendedor). Dessa forma, a consulta externa avalia:

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

Como isso é falso, a linha de Syed Abbas não será incluída nos resultados. Siga o mesmo procedimento com relação à linha de Pamela Ansman-Wolfe. Você observará que essa linha está incluída nos resultados.

As subconsultas correlacionadas também podem incluir funções com valor de tabela na cláusula FROM, fazendo referência a colunas de uma tabela na consulta externa como argumento da função com valor de tabela. Nesse caso, para cada linha da consulta externa, a função com valor de tabela é avaliada segundo a subconsulta.