In SQL Server puoi utilizzare ANY
operatore logico per confrontare un valore scalare con un insieme di valori a colonna singola restituito da una sottoquery.
Può essere utilizzato con sottoquery che hanno un set di risultati di una colonna.
Il ANY
operatore è l'equivalente di SOME
operatore logico.
Esempio
Supponiamo di avere due tabelle; Cats
e Dogs
Gatti
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Cani
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Ora eseguiamo una sottoquery utilizzando ANY
operatore.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Risultato:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs SOME
Otterremmo lo stesso risultato se cambiassimo la query in modo che utilizzi SOME
operatore invece di ANY
.
Qui sta usando SOME
operatore invece di ANY
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Risultato:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
rispetto a IN
Potremmo anche usare IN
operatore per ottenere lo stesso risultato.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Risultato:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs EXISTS
Potremmo fare la stessa cosa con EXISTS
operatore.
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Risultato:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Errore 116?
Se ricevi l'errore 116 quando usi ANY
, probabilmente è perché stai selezionando più colonne nella tua sottoquery. Il ANY
l'operatore può essere utilizzato solo con sottoquery che hanno un set di risultati di una colonna.
Ecco un esempio di come possiamo causare questo errore.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT * FROM Dogs);
Risultato:
Msg 116, Level 16, State 1, Line 5 Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
In questo senso, il ANY
l'operatore è più simile a IN
operatore rispetto a EXISTS
operatore. Otterremmo lo stesso errore con IN
.
Se devi restituire più colonne nella tua sottoquery, usa EXISTS
.