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 do sobrenome de cada funcionário para os quais os bônus da tabela SalesPerson sejam 5.000, e para os quais existam números de identificação de funcionário correspondentes nas tabelas Employee e 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

Aqui está o conjunto de resultados.

LastName FirstName BusinessEntityID

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

Ansman-Wolfe Pamela 280

Saraiva José 282

(2 linhas afetadas)

A subconsulta anterior dessa instrução não pode ser avaliada independentemente da consulta externa. É necessário um valor de Employee.BusinessEntityID, 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.BusinessEntityID ficará com o valor 285, que o SQL Server substituirá na consulta interna.

USE AdventureWorks2008R2;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE BusinessEntityID = 285;

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

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)

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.