Se você receber a mensagem de erro 512 que diz “Subconsulta retornou mais de 1 valor…” no SQL Server, é porque você está usando uma subconsulta que retorna mais de um valor em um cenário em que isso não é permitido.
Exemplo de erro
Suponha que temos as duas tabelas a seguir:
SELECT * FROM Dogs;
SELECT * FROM Cats;
Resultado:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 4 | Fluffy | +---------+-----------+ +---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
E executamos a seguinte consulta nessas duas tabelas:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats );
Resultado:
Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Podemos ver que resultou no erro Msg 512.
Esta mensagem de erro nos diz explicitamente que a “Subconsulta retornou mais de 1 valor” e que “Isso não é permitido quando a subconsulta segue =, !=, <, <=,>,>=ou quando a subconsulta é usada como uma expressão ”.
A solução para isso dependerá do que você está tentando fazer na consulta. Abaixo estão algumas opções para resolver esse problema.
Solução 1
Uma maneira de lidar com isso é usar um operador diferente. O que quero dizer é, use um operador diferente de
=
, !=
, <
, <=
, >
, ou >=
. Aqui está um exemplo que usa o
IN
operador:SELECT * FROM Dogs
WHERE DogName IN ( SELECT CatName FROM Cats );
Resultado:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Solução 2
Outra opção é manter os iguais (
=
) (ou qualquer operador que esteja na consulta original), mas altere a subconsulta. Aqui está um exemplo de alteração da subconsulta, mantendo o operador equals:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );
Resultado:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Nesse caso, a subconsulta retornou apenas um valor, e o operador equals estava bem com isso.
Solução 3
Observe que as subconsultas acima retornam apenas uma coluna. Se as subconsultas retornarem várias colunas, precisaremos alterar a consulta externa para que ela use o
EXISTS
operador. Exemplo:
SELECT * FROM Dogs d
WHERE EXISTS ( SELECT * FROM Cats c WHERE c.CatName = d.DogName );
Resultado:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Se não o alterarmos para usar o
EXISTS
operador, provavelmente receberíamos a mensagem de erro 116.