Sottoquery con operatori di confronto
Le sottoquery possono essere introdotte da uno dei seguenti operatori di confronto =, < >, >, > =, <, ! >, ! < o < =.
In modo analogo alle sottoquery introdotte da IN, le sottoquery introdotte da un operatore di confronto non modificato, ovvero non seguito dalla parola chiave ANY o ALL, devono restituire un solo valore anziché un elenco di valori. Se una sottoquery di questo tipo restituisce più valori, in SQL Server viene visualizzato un messaggio di errore.
Per utilizzare una sottoquery introdotta da un operatore di confronto non modificato, è necessario aver acquisito una certa familiarità con i dati e la natura del problema in modo da sapere che la sottoquery restituirà un solo valore.
Si supponga, ad esempio, che ogni venditore copra una sola zona di vendita e che si desideri trovare i clienti che risiedono nella zona coperta da Linda Mitchell. In questo caso è possibile scrivere un'istruzione con una sottoquery introdotta dall'operatore di confronto =.
USE AdventureWorks2008R2;
GO
SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID =
(SELECT TerritoryID
FROM Sales.SalesPerson
WHERE BusinessEntityID = 276)
Se, tuttavia, Linda Mitchell copre più zone di vendita, verrà restituito un messaggio di errore. In questo caso, è possibile formulare la sottoquery con la parola chiave IN (oppure = ANY) anziché con l'operatore di confronto =.
Le sottoquery introdotte da un operatore di confronto non modificato spesso includono funzioni di aggregazione, in quanto tali funzioni restituiscono un solo valore. L'istruzione seguente consente ad esempio di individuare i nomi di tutti i prodotti il cui prezzo di listino è superiore a quello medio.
Use AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ListPrice >
(SELECT AVG (ListPrice)
FROM Production.Product)
Poiché le sottoquery introdotte da un operatore di confronto non modificato devono restituire un solo valore, non è possibile includervi clausole GROUP BY o HAVING, a meno che tali clausole non restituiscano un solo valore. La query seguente consente, ad esempio, di individuare i prodotti il cui prezzo è maggiore rispetto al prodotto di prezzo più basso nella sottocategoria 14.
Use AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ListPrice >
(SELECT MIN (ListPrice)
FROM Production.Product
GROUP BY ProductSubcategoryID
HAVING ProductSubcategoryID = 14)