sql >> Databasteknik >  >> RDS >> Sqlserver

Fix Msg 512 "Subquery returned more than 1 value" i SQL Server

Om du får felmeddelande 512 som lyder "Subquery returned more than 1 value..." i SQL Server, beror det på att du använder en subquery som returnerar mer än ett värde i ett scenario där detta inte är tillåtet.

Exempel på fel

Anta att vi har följande två tabeller:

SELECT * FROM Dogs;

SELECT * FROM Cats;

Resultat:

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

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

Och vi kör följande fråga mot dessa två tabeller:

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

Resultat:

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.

Vi kan se att det resulterade i felmeddelande 512.

Det här felmeddelandet berättar uttryckligen för oss att "Underfrågan returnerade mer än 1 värde" och att "Detta är inte tillåtet när underfrågan följer =, !=, <, <=,>,>=eller när underfrågan används som ett uttryck ”.

Lösningen på detta beror på vad du försöker göra i frågan. Nedan finns ett par alternativ för att lösa det här problemet.

Lösning 1

Ett sätt att hantera detta är att använda en annan operatör. Vad jag menar är, använd en annan operator än = , != , < , <= , > , eller >= .

Här är ett exempel som använder IN operatör:

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

Resultat:

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

Lösning 2

Ett annat alternativ är att behålla lika (= ) operator (eller vilken operator som finns i den ursprungliga frågan), men ändra underfrågan.

Här är ett exempel på hur du ändrar underfrågan, samtidigt som operatorn equals behålls:

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

Resultat:

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

I det här fallet returnerade underfrågan bara ett värde, och equals-operatorn var bra med det.

Lösning 3

Observera att underfrågorna ovan endast returnerar en kolumn. Om underfrågorna returnerade flera kolumner, skulle vi behöva ändra den yttre frågan så att den använder EXISTS operatör.

Exempel:

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

Resultat:

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

Om vi ​​inte ändrade det till att använda EXISTS operatör, då skulle vi förmodligen få felmeddelande 116.


  1. pyodbc kan inte ansluta till databasen

  2. STR_TO_DATE() Exempel – MySQL

  3. Hur SQLite Nullif() fungerar

  4. Kör sp_msforeachdb i en Java-applikation