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

Comment réparer "Une seule expression peut être spécifiée dans la liste de sélection…" dans SQL Server

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);