Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Поправете съобщение 512 „Подзаявката върна повече от 1 стойност“ в SQL Server

Ако получите съобщение за грешка 512, което гласи „Подзаявката върна повече от 1 стойност...“ в SQL Server, това е защото използвате подзаявка, която връща повече от една стойност в сценарий, при който това не е разрешено.

Пример за грешка

Да предположим, че имаме следните две таблици:

SELECT * FROM Dogs;

SELECT * FROM Cats;

Резултат:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 4       | Fluffy    |
+---------+-----------+

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

И ние изпълняваме следната заявка към тези две таблици:

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

Резултат:

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.

Можем да видим, че това е довело до грешка Msg 512.

Това съобщение за грешка изрично ни казва, че „Подзаявката върна повече от 1 стойност“ и че „Това не е разрешено, когато подзаявката следва =, !=, <, <=,>,>=или когато подзаявката се използва като израз “.

Решението на това ще зависи от това, което се опитвате да направите в заявката. По-долу са дадени няколко опции за разрешаване на този проблем.

Решение 1

Един от начините да се справите с това е да използвате различен оператор. Това, което имам предвид, е да използвате оператор, различен от = , != , < , <= , > или >= .

Ето пример, който използва IN оператор:

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

Резултат:

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

Решение 2

Друга възможност е да запазите равните (= ) (или който и да е оператор в оригиналната заявка), но променете подзаявката.

Ето пример за промяна на подзаявката, като се запази операторът за равенство:

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

Резултат:

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

В този случай подзаявката върна само една стойност и операторът за равенство се справи добре с това.

Решение 3

Имайте предвид, че горните подзаявки връщат само една колона. Ако подзаявките върнаха няколко колони, ще трябва да променим външната заявка, така че да използва EXISTS оператор.

Пример:

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

Резултат:

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

Ако не сме го променили, за да използваме EXISTS оператор, тогава вероятно ще получим съобщение за грешка 116.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. OLTP в паметта:Какво е новото в SQL Server 2016

  2. Получаване на връщаната стойност от JDBC MSSQL

  3. SQL Server:Примери за PIVOTing String данни

  4. Инсталиране на клъстер за отказване на SQL сървър -1

  5. Събития на изчакване на SQL сървър -2