Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Napraw komunikat 512 „Podzapytanie zwróciło więcej niż 1 wartość” w SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uwaga użytkownicy korzystający z SQL Server 2008 i SQL Server 2008 R2

  2. Obliczanie sumy bieżącej z klauzulą ​​OVER i klauzulą ​​PARTITION BY w SQL Server

  3. Zwróć bieżącą nazwę logowania w SQL Server (T-SQL)

  4. Jak programowo ustawić parametry połączenia dla Entity-Framework Code-First?

  5. Zakończenie wsparcia dla SQL Server 2008. Co teraz?