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

Corrija el mensaje 512 "La subconsulta devolvió más de 1 valor" en SQL Server

Si recibe el mensaje de error 512 que dice "La subconsulta devolvió más de 1 valor..." en SQL Server, es porque está utilizando una subconsulta que devuelve más de un valor en un escenario donde esto no está permitido.

Ejemplo de error

Supongamos que tenemos las siguientes dos tablas:

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   |
+---------+-----------+

Y ejecutamos la siguiente consulta en esas dos tablas:

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 resultó en el mensaje de error 512.

Este mensaje de error nos dice explícitamente que la "Subconsulta devolvió más de 1 valor" y que "Esto no está permitido cuando la subconsulta sigue =, !=, <, <=,>,>=o cuando la subconsulta se usa como una expresión ”.

La solución a esto dependerá de lo que intente hacer en la consulta. A continuación hay un par de opciones para resolver este problema.

Solución 1

Una forma de lidiar con esto es usar un operador diferente. Lo que quiero decir es que use un operador que no sea = , != , < , <= , > , o >= .

Aquí hay un ejemplo que usa el IN operador:

SELECT * FROM Dogs 
WHERE DogName IN ( SELECT CatName FROM Cats );

Resultado:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 2       | Fluffy    |
| 4       | Fluffy    |
+---------+-----------+

Solución 2

Otra opción es mantener los iguales (= ) (o el operador que esté en la consulta original), pero cambie la subconsulta.

Aquí hay un ejemplo de cómo cambiar la subconsulta, manteniendo el operador igual:

SELECT * FROM Dogs 
WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );

Resultado:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 2       | Fluffy    |
| 4       | Fluffy    |
+---------+-----------+

En este caso, la subconsulta devolvió un solo valor, y el operador igual estuvo bien con eso.

Solución 3

Tenga en cuenta que las subconsultas anteriores solo devuelven una columna. Si las subconsultas arrojaron varias columnas, necesitaríamos cambiar la consulta externa para que use EXISTS operador.

Ejemplo:

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

Resultado:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 2       | Fluffy    |
| 4       | Fluffy    |
+---------+-----------+

Si no lo cambiamos para usar EXISTS operador, entonces probablemente obtendríamos el mensaje de error 116.