Subconsultas correlativas

Se pueden evaluar muchas consultas mediante la ejecución de la subconsulta una vez y la sustitución del valor o valores resultantes en la cláusula WHERE de la consulta externa. En las consultas que incluyen una subconsulta correlativa (conocida también como una consulta repetitiva), la subconsulta depende de la consulta externa para sus valores. Esto significa que la subconsulta se ejecuta varias veces, una vez por cada fila que pueda ser seleccionada por la consulta externa.

Esta consulta recupera una instancia del nombre y apellido de cada empleado cuya bonificación en la tabla SalesPerson es 5000 y cuyos números de identificación de empleado coinciden en las tablas Employee y 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

El conjunto de resultados es el siguiente.

Apellido Nombre BusinessEntityID

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

Ansman-Wolfe Pamela 280

Saraiva José 282

(2 filas afectadas)

La subconsulta anterior de esta instrucción no se puede evaluar independientemente de la consulta externa. Necesita un valor para Employee.BusinessEntityID, pero este valor cambia a medida que SQL Server examina diferentes filas en Employee.

Así es, exactamente, como se evalúa esta consulta: SQL Server tiene en cuenta cada fila de la tabla Employee para incluirla en el resultado sustituyendo el valor de cada fila en la consulta interna. Por ejemplo, si SQL Server examina primero la fila de Syed Abbas, la variable Employee.BusinessEntityID toma el valor 285, que SQL Server sustituye en la consulta interna.

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

El resultado es 0 (Syed Abbas no recibió una bonificación porque no es un vendedor), con lo que la consulta externa se evalúa como:

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)

Puesto que esto es falso, la fila de Syed Abbas no se incluye en los resultados. Realice el mismo procedimiento con la fila de Pamela Ansman-Wolfe. Observe que esta fila se incluye en el resultado.

Las subconsultas correlativas también pueden incluir funciones con valores de tabla en la cláusula FROM mediante la referencia a las columnas de una tabla de la consulta externa como un argumento de la función con valores de tabla. En este caso, para cada fila de la consulta externa, la función con valores de tabla se evalúa según la subconsulta.