Dans SQL Server, le message d'erreur 116 se produit lorsque vous essayez de sélectionner plusieurs colonnes dans une sous-requête sans l'introduire avec le EXISTS
opérateur.
L'erreur complète ressemble à ceci :
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.
Exemple
Voici un exemple de requête qui génère cette erreur.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (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.
Le problème avec cette requête est que la sous-requête utilise un astérisque (*
) pour sélectionner toutes les colonnes de Dogs
table. Cette table a plusieurs colonnes, et donc l'erreur est produite.
Comment corriger l'erreur
Nous pouvons corriger l'erreur ci-dessus de plusieurs manières.
Une façon de résoudre ce problème consiste à remplacer l'astérisque (*
) avec un seul nom de colonne dans la sous-requête :
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Cela signifie que la sous-requête renvoie désormais une seule colonne au lieu de toutes les colonnes de la table.
Une autre façon de le réparer est de faire ce que le message d'erreur suggère et d'utiliser le EXISTS
opérateur au lieu de IN
.
Cela nécessite une légère variation dans la construction de la requête :
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);
Comme vous pouvez vous y attendre, le EXISTS
fonctionnera également même si vous n'indiquez explicitement qu'une seule colonne :
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Mais contrairement au IN
opérateur, EXISTS
fonctionnera également si vous sélectionnez explicitement plusieurs noms de colonne dans la sous-requête :
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);