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 .