Condividi tramite


Sottoquery con EXISTS

Le subquery introdotte dalla parola chiave EXISTS fungono da test di esistenza dei dati. La clausola WHERE della query esterna verifica l'esistenza delle righe restituite dalla subquery. La subquery non restituisce dati, ma TRUE o FALSE.

Per specificare una subquery introdotta da EXISTS, utilizzare la sintassi seguente:

WHERE [NOT] EXISTS (subquery)

La query seguente individua i nomi di tutti i prodotti nella sottocategoria Wheels:

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE EXISTS
    (SELECT * 
     FROM Production.ProductSubcategory
     WHERE ProductSubcategoryID = 
            Production.Product.ProductSubcategoryID
        AND Name = 'Wheels')

Set di risultati:

Name
--------------------------------------------------
LL Mountain Front Wheel
ML Mountain Front Wheel
HL Mountain Front Wheel
LL Road Front Wheel
ML Road Front Wheel
HL Road Front Wheel
Touring Front Wheel
LL Mountain Rear Wheel
ML Mountain Rear Wheel
HL Mountain Rear Wheel
LL Road Rear Wheel
ML Road Rear Wheel
HL Road Rear Wheel
Touring Rear Wheel

(14 row(s) affected)

Per determinare i risultati di questa query, è necessario considerare di volta in volta se nel nome di ogni prodotto la subquery restituisce almeno una riga, in altri termini, se il test di esistenza restituisce TRUE.

Si noti che le subquery introdotte da EXISTS sono leggermente diverse rispetto alle altre subquery, e precisamente:

  • La parola chiave EXISTS non è preceduta dal nome di una colonna, da una costante o da altre espressioni.

  • Nella maggior parte dei casi l'elenco di selezione di una subquery introdotta da EXISTS è costituito da un asterisco (*). Non è necessario infatti specificare i nomi di colonna, in quanto viene semplicemente verificata l'esistenza di righe che soddisfano le condizioni specificate nella subquery.

La parola chiave EXISTS è importante in quanto spesso non esiste una formulazione alternativa a una subquery. Mentre per alcune query introdotte dalla parola chiave EXISTS non è disponibile alcuna formulazione alternativa, tutte le query che utilizzano IN o un operatore di confronto modificato da ANY o ALL consentono di ottenere risultati simili.

Ad esempio, la query precedente può essere formulata utilizzando IN:

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
    (SELECT ProductSubcategoryID
     FROM Production.ProductSubcategory
     WHERE Name = 'Wheels')