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

Explication de l'opérateur SQL Server SOME

Dans SQL Server, vous pouvez utiliser le SOME 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 SOME l'opérateur est l'équivalent du ANY opérateur logique.

Exemple

Imaginez que nous avons 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 = SOME (SELECT DogName FROM Dogs);

Résultat :

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME vs ANY

Comme mentionné, SOME est l'équivalent de ANY .

Nous pourrions donc modifier notre requête pour utiliser ANY au lieu de SOME .

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);

Résultat :

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME vs IN

Nous obtiendrions le même résultat si nous devions modifier la requête pour qu'elle utilise le IN opérateur au lieu de SOME .

Ici, il utilise le IN opérateur.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName IN (SELECT DogName FROM Dogs);

Résultat :

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME vs EXISTS

Nous pourrions faire la même chose avec le EXISTS opérateur.

Ici, il utilise 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 SOME , c'est probablement parce que vous sélectionnez plusieurs colonnes dans votre sous-requête. Le SOME 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 = SOME (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.

Nous aurions la même erreur avec IN . Si vous devez renvoyer plusieurs colonnes dans votre sous-requête, utilisez EXISTS .