Condividi tramite


Sottoquery con operatori di confronto

Le subquery possono essere introdotte da un operatore di confronto, ovvero =, < >, >, > =, <, ! >, ! < o < =.

In modo analogo alle subquery introdotte da IN, le subquery 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 subquery di questo tipo restituisce più valori, in MicrosoftSQL Server viene visualizzato un messaggio di errore.

Per utilizzare una subquery 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 subquery 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 subquery introdotta dall'operatore di confronto =.

USE AdventureWorks;
GO
SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID =
    (SELECT TerritoryID
     FROM Sales.SalesPerson
     WHERE SalesPersonID = 276)

Se, tuttavia, Linda Mitchell copre più zone di vendita, verrà restituito un messaggio di errore. In questo caso, è possibile formulare la subquery con la parola chiave IN (oppure = ANY) anziché con l'operatore di confronto =.

Le subquery 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 AdventureWorks
SELECT Name
FROM Production.Product
WHERE ListPrice >
    (SELECT AVG (ListPrice)
     FROM Production.Product)

Poiché le subquery 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 AdventureWorks
SELECT Name
FROM Production.Product
WHERE ListPrice >
    (SELECT MIN (ListPrice)
     FROM Production.Product
     GROUP BY ProductSubcategoryID
     HAVING ProductSubcategoryID = 14)

Vedere anche

Concetti