Sottoquery correlate
In molti casi per valutare le query è possibile eseguire una volta la sottoquery e sostituire quindi i valori ottenuti a quelli specificati nella clausola WHERE della query esterna. Nelle query che includono una sottoquery correlata (nota anche come sottoquery ripetuta), i valori della sottoquery variano in base ai valori della query esterna. Ciò significa che la sottoquery viene eseguita ripetutamente, una volta per ogni riga selezionata dalla query esterna.
Questa query recupera un'istanza del nome e cognome di ciascun dipendente per il quale il premio di produzione nella tabella SalesPerson è pari a 5000 e per il quale sono presenti numeri di matricola corrispondenti nelle tabelle 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
Set di risultati:
LastName FirstName BusinessEntityID
-------------------------- ---------- ------------
Ansman-Wolfe Pamela 280
Saraiva José 282
(2 righe interessate)
La sottoquery precedente non può essere valutata indipendentemente dalla query esterna. Richiede infatti un valore per Employee.BusinessEntityID, ma questo valore cambia quando SQL Server esamina righe diverse della tabella Employee.
La query viene valutata nel modo seguente: in SQL Server viene esaminata ogni riga della tabella Employee per determinare se verrà inclusa nei risultati tramite la sostituzione del valore di ogni riga nella query interna. Ad esempio, se SQL Server esamina per prima la riga relativa a Syed Abbas, la variabile Employee.BusinessEntityID assumerà il valore 285, che SQL Server sostituisce automaticamente al valore nella query interna.
USE AdventureWorks2008R2;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE BusinessEntityID = 285;
Poiché il risultato è 0 (Syed Abbas non ha ricevuto un premio di produzione perché non è un venditore), la query esterna viene valutata nel modo seguente:
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)
La riga relativa a Syed Abbas non rispetta la condizione specificata e non viene pertanto inclusa nel set di risultati. Eseguire la stessa procedura per la riga relativa a Pamela Ansman-Wolfe. La riga verrà inclusa nei risultati.
Le sottoquery correlate possono inoltre includere funzioni con valori di tabella nella clausola FROM se un argomento di tali funzioni fa riferimento a colonne di una tabella della query esterna. In questo caso, per ogni riga della query esterna, la funzione viene valutata in base alla sottoquery.