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 (definita anche 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.

La query seguente recupera un'istanza di ogni nome e cognome di 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 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

Set di risultati:

LastName FirstName EmployeeID

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

Ansman-Wolfe Pamela 280

Saraiva José 282

(2 row(s) affected)

La sottoquery precedente non può essere valutata indipendentemente dalla query esterna. Richiede infatti un valore per Employee.EmployeeID, che tuttavia viene modificato quando SQL Server esamina righe diverse in 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.EmployeeID assumerà il valore 288, che SQL Server sostituisce automaticamente al valore nella query interna.

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

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 AdventureWorks;
GO
SELECT LastName, FirstName
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID 
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.