Dans SQL Server, vous pouvez utiliser le ANY
opérateur logique pour comparer une valeur scalaire avec un ensemble de valeurs à une seule colonne renvoyé par une sous-requête.
Il peut être utilisé avec des sous-requêtes qui ont un ensemble de résultats d'une colonne.
Le ANY
l'opérateur est l'équivalent du SOME
opérateur logique.
Exemple
Supposons que nous ayons deux tables ; Cats
et Dogs
Chats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Chiens
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Exécutons maintenant une sous-requête en utilisant le ANY
opérateur.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Résultat :
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs SOME
Nous obtiendrions le même résultat si nous devions modifier la requête pour qu'elle utilise le SOME
opérateur au lieu de ANY
.
Ici, il utilise le SOME
opérateur au lieu de ANY
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Résultat :
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs IN
Nous pourrions également utiliser le IN
opérateur pour obtenir le même résultat.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Résultat :
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs EXISTS
Nous pourrions faire la même chose avec le EXISTS
opérateur.
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Résultat :
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Erreur 116 ?
Si vous obtenez l'erreur 116 lors de l'utilisation de ANY
, c'est probablement parce que vous sélectionnez plusieurs colonnes dans votre sous-requête. Le ANY
L'opérateur ne peut être utilisé qu'avec des sous-requêtes qui ont un ensemble de résultats d'une colonne.
Voici un exemple de la façon dont nous pouvons provoquer cette erreur.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT * FROM Dogs);
Résultat :
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.
En ce sens, le ANY
l'opérateur est plus similaire au IN
opérateur qu'il ne l'est pour EXISTS
opérateur. Nous aurions la même erreur avec IN
.
Si vous devez renvoyer plusieurs colonnes dans votre sous-requête, utilisez EXISTS
.