Ако получите съобщение за грешка 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.