Jeśli otrzymasz komunikat o błędzie 512, który brzmi „Podzapytanie zwróciło więcej niż 1 wartość…” w SQL Server, dzieje się tak dlatego, że używasz podzapytania, które zwraca więcej niż jedną wartość w scenariuszu, w którym nie jest to dozwolone.
Przykład błędu
Załóżmy, że mamy następujące dwie tabele:
SELECT * FROM Dogs;
SELECT * FROM Cats;
Wynik:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 4 | Fluffy | +---------+-----------+ +---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
I uruchamiamy następujące zapytanie względem tych dwóch tabel:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats );
Wynik:
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.
Widzimy, że spowodowało to błąd Msg 512.
Ten komunikat o błędzie wyraźnie informuje nas, że „Podzapytanie zwróciło więcej niż 1 wartość” i że „Nie jest to dozwolone, gdy podzapytanie następuje po =, !=, <, <=,>,>=lub gdy podzapytanie jest używane jako wyrażenie ”.
Rozwiązanie tego będzie zależeć od tego, co próbujesz zrobić w zapytaniu. Poniżej znajduje się kilka opcji rozwiązania tego problemu.
Rozwiązanie 1
Jednym ze sposobów radzenia sobie z tym jest użycie innego operatora. Mam na myśli użycie operatora innego niż =
, !=
, <
, <=
, > lub
>=
.
Oto przykład, który używa IN
operator:
SELECT * FROM Dogs
WHERE DogName IN ( SELECT CatName FROM Cats );
Wynik:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Rozwiązanie 2
Inną opcją jest zachowanie równości (=
) operator (lub którykolwiek z operatorów w pierwotnym zapytaniu), ale zmień podzapytanie.
Oto przykład zmiany podzapytania przy zachowaniu operatora równości:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );
Wynik:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
W tym przypadku podzapytanie zwróciło tylko jedną wartość, a operator równości był z tym w porządku.
Rozwiązanie 3
Zauważ, że powyższe podzapytania zwracają tylko jedną kolumnę. Jeśli podzapytania zwróciły wiele kolumn, musielibyśmy zmienić zapytanie zewnętrzne tak, aby używało ISTNIEJE
operatora.
Przykład:
SELECT * FROM Dogs d
WHERE EXISTS ( SELECT * FROM Cats c WHERE c.CatName = d.DogName );
Wynik:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Gdybyśmy nie zmienili tego, aby użyć ISTNIEJE
operatora, wtedy prawdopodobnie otrzymalibyśmy komunikat o błędzie 116.