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 .