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.