sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo corregir "Solo se puede especificar una expresión en la lista de selección..." en SQL Server

En SQL Server, aparece el mensaje de error 116 cuando intenta seleccionar varias columnas en una subconsulta sin introducirla con EXISTS operador.

El error completo se ve así:

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.

Ejemplo

Este es un ejemplo de una consulta que produce este error.

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

Resultado:

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.

El problema con esta consulta es que la subconsulta usa un asterisco (* ) para seleccionar todas las columnas de Dogs mesa. Esa tabla tiene varias columnas, por lo que se produce el error.

Cómo corregir el error

Podemos corregir el error anterior de varias maneras.

Una forma de solucionarlo es reemplazar el asterisco (* ) con un solo nombre de columna en la subconsulta:

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

Esto significa que la subconsulta ahora devuelve solo una columna en lugar de todas las columnas de la tabla.

Otra forma de solucionarlo es hacer lo que sugiere el mensaje de error y usar EXISTS operador en lugar de IN .

Hacer esto requiere una ligera variación en la construcción de la consulta:

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);

Como es de esperar, EXISTS El operador también funcionará incluso si solo indica explícitamente una columna:

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

Pero en contraste con el IN operador, EXISTS también funcionará si selecciona explícitamente varios nombres de columna en la subconsulta:

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);