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
.