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