Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como corrigir “Apenas uma expressão pode ser especificada na lista de seleção…” no SQL Server


No SQL Server, a mensagem de erro 116 ocorre quando você tenta selecionar várias colunas em uma subconsulta sem introduzi-la com o EXISTS operador.

O erro completo é assim:
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.

Exemplo


Aqui está um exemplo de uma consulta que produz esse erro.
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.

O problema com esta consulta é que a subconsulta usa um asterisco (* ) para selecionar todas as colunas do Dogs tabela. Essa tabela tem várias colunas e, portanto, o erro é produzido.

Como corrigir o erro


Podemos corrigir o erro acima de duas maneiras.

Uma maneira de corrigi-lo é substituir o asterisco (* ) com um único nome de coluna na subconsulta:
SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName IN (SELECT DogName FROM Dogs);

Isso significa que a subconsulta agora retorna apenas uma coluna em vez de todas as colunas da tabela.

Outra maneira de corrigi-lo é fazer o que a mensagem de erro sugere e usar o EXISTS operador em vez de IN .

Fazer isso requer uma pequena variação na construção da consulta:
SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);

Como você pode esperar, o EXISTS operador também funcionará mesmo se você declarar explicitamente apenas uma coluna:
SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Mas em contraste com o IN operador, EXISTS também funcionará se você selecionar explicitamente vários nomes de coluna na subconsulta:
SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);