Hvis du får fejlmeddelelse 512, der lyder "Subquery returned more than 1 value..." i SQL Server, er det fordi du bruger en underforespørgsel, der returnerer mere end én værdi i et scenarie, hvor dette ikke er tilladt.
Eksempel på fejl
Antag, at vi har følgende to 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 | +---------+-----------+
Og vi kører følgende forespørgsel mod disse to 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, at det resulterede i fejlmeddelelse 512.
Denne fejlmeddelelse fortæller os eksplicit, at "Underforespørgslen returnerede mere end 1 værdi", og at "Dette er ikke tilladt, når underforespørgslen følger efter =, !=, <, <=,>,>=, eller når underforespørgslen bruges som et udtryk ”.
Løsningen på dette vil afhænge af, hvad du forsøger at gøre i forespørgslen. Nedenfor er et par muligheder for at løse dette problem.
Løsning 1
En måde at håndtere dette på er at bruge en anden operatør. Hvad jeg mener er, brug en anden operator end =
, !=
, <
, <=
, > eller
>=
.
Her er et eksempel, der bruger IN
operatør:
SELECT * FROM Dogs
WHERE DogName IN ( SELECT CatName FROM Cats );
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Løsning 2
En anden mulighed er at beholde lige (=
) operator (eller hvilken som helst operator der er i den oprindelige forespørgsel), men skift underforespørgslen.
Her er et eksempel på at ændre underforespørgslen, mens du beholder equals-operatoren:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
I dette tilfælde returnerede underforespørgslen kun én værdi, og lige-operatoren havde det fint med det.
Løsning 3
Bemærk, at ovenstående underforespørgsler kun returnerer én kolonne. Hvis underforespørgslerne returnerede flere kolonner, er vi nødt til at ændre den ydre forespørgsel, så den bruger EXISTS
operatør.
Eksempel:
SELECT * FROM Dogs d
WHERE EXISTS ( SELECT * FROM Cats c WHERE c.CatName = d.DogName );
Resultat:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Hvis vi ikke ændrede det til at bruge EXISTS
operatør, så ville vi sandsynligvis få fejlmeddelelse 116.