Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Explication de l'opérateur SQL Server ANY

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 .