Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Correggere il messaggio 512 "La sottoquery ha restituito più di 1 valore" in SQL Server

Se ricevi un messaggio di errore 512 che dice "La sottoquery ha restituito più di 1 valore..." in SQL Server, è perché stai usando una sottoquery che restituisce più di un valore in uno scenario in cui ciò non è consentito.

Esempio di errore

Supponiamo di avere le seguenti due tabelle:

SELECT * FROM Dogs;

SELECT * FROM Cats;

Risultato:

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

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

Ed eseguiamo la seguente query su queste due tabelle:

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

Risultato:

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.

Possiamo vedere che ha provocato l'errore Msg 512.

Questo messaggio di errore ci dice esplicitamente che "La sottoquery ha restituito più di 1 valore" e che "Ciò non è consentito quando la sottoquery segue =, !=, <, <=,>,>=o quando la sottoquery viene utilizzata come espressione ”.

La soluzione a questo dipenderà da cosa stai cercando di fare nella query. Di seguito sono riportate un paio di opzioni per risolvere questo problema.

Soluzione 1

Un modo per affrontare questo problema è utilizzare un operatore diverso. Quello che voglio dire è, usa un operatore diverso da = , != , < , <= , > o >= .

Ecco un esempio che utilizza IN operatore:

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

Risultato:

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

Soluzione 2

Un'altra opzione è mantenere l'uguale (= ) (o qualsiasi operatore sia nella query originale), ma cambia la sottoquery.

Ecco un esempio di modifica della sottoquery, mantenendo l'operatore uguale:

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

Risultato:

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

In questo caso la sottoquery ha restituito un solo valore e l'operatore equals andava bene con quello.

Soluzione 3

Si noti che le sottoquery precedenti restituiscono solo una colonna. Se le sottoquery restituiscono più colonne, dovremmo modificare la query esterna in modo che utilizzi EXISTS operatore.

Esempio:

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

Risultato:

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

Se non lo abbiamo modificato per utilizzare EXISTS operatore, probabilmente riceveremmo il messaggio di errore 116.