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

Corrige Msg 512 “Subconsulta retornou mais de 1 valor” no SQL Server


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.