sql >> Database >  >> RDS >> Sqlserver

Fix Msg 512 "Subquery heeft meer dan 1 waarde geretourneerd" in SQL Server

Als u foutbericht 512 krijgt met de tekst "Subquery heeft meer dan 1 waarde geretourneerd..." in SQL Server, komt dat omdat u een subquery gebruikt die meer dan één waarde retourneert in een scenario waarin dit niet is toegestaan.

Voorbeeld van fout

Stel dat we de volgende twee tabellen hebben:

SELECT * FROM Dogs;

SELECT * FROM Cats;

Resultaat:

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

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

En we voeren de volgende query uit op die twee tabellen:

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

Resultaat:

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.

We kunnen zien dat dit resulteerde in foutbericht 512.

Deze foutmelding vertelt ons expliciet dat de "Subquery meer dan 1 waarde heeft geretourneerd" en dat "Dit niet is toegestaan ​​wanneer de subquery volgt =, !=, <, <=,>,>=of wanneer de subquery wordt gebruikt als een expressie ”.

De oplossing hiervoor hangt af van wat u in de query probeert te doen. Hieronder staan ​​een aantal opties om dit probleem op te lossen.

Oplossing 1

Een manier om hiermee om te gaan, is door een andere operator te gebruiken. Wat ik bedoel is, gebruik een andere operator dan = , != , < , <= , > , of >= .

Hier is een voorbeeld dat de IN . gebruikt operator:

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

Resultaat:

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

Oplossing 2

Een andere optie is om de gelijken te behouden (= ) operator (of welke operator dan ook in de originele query), maar verander de subquery.

Hier is een voorbeeld van het wijzigen van de subquery, met behoud van de operator is gelijk aan:

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

Resultaat:

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

In dit geval retourneerde de subquery slechts één waarde, en de operator equals vond dat prima.

Oplossing 3

Houd er rekening mee dat de bovenstaande subquery's slechts één kolom retourneren. Als de subquery's meerdere kolommen hebben geretourneerd, moeten we de buitenste query wijzigen zodat deze de EXISTS gebruikt telefoniste.

Voorbeeld:

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

Resultaat:

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

Als we het niet hebben gewijzigd om de EXISTS . te gebruiken operator, dan krijgen we waarschijnlijk foutmelding 116.


  1. Belangrijke gezondheidscontroles voor uw MySQL Source-Replica-servers

  2. Uw gebruikers vertellen dat ze zelf moeten gaan forken

  3. verschil tussen plan uitleggen en uitvoeringsplan

  4. MySQL-database kopiëren