In SQL Server, puoi utilizzare SOME
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 SOME
operatore è l'equivalente di ANY
operatore logico.
Esempio
Immagina di avere due tavoli; 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 = SOME (SELECT DogName FROM Dogs);
Risultato:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
rispetto a ANY
Come accennato, SOME
è l'equivalente di ANY
.
Quindi potremmo modificare la nostra query per utilizzare ANY
invece di SOME
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Risultato:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
rispetto a IN
Otterremmo lo stesso risultato se cambiassimo la query in modo che utilizzi il IN
operatore invece di SOME
.
Qui sta usando il IN
operatore.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Risultato:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs EXISTS
Potremmo fare la stessa cosa con EXISTS
operatore.
Qui sta usando il 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 SOME
, è probabilmente perché stai selezionando più colonne nella tua sottoquery. Il SOME
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 = SOME (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.
Otterremmo lo stesso errore con IN
. Se devi restituire più colonne nella tua sottoquery, usa EXISTS
.