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 .