I SQL Server opstår fejlmeddelelse 116, når du forsøger at vælge flere kolonner i en underforespørgsel uden at introducere den med EXISTS
operatør.
Den fulde fejl ser således ud:
Msg 116, Level 16, State 1, Line 5 Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
Eksempel
Her er et eksempel på en forespørgsel, der producerer denne fejl.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT * FROM Dogs);
Resultat:
Msg 116, Level 16, State 1, Line 5 Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
Problemet med denne forespørgsel er, at underforespørgslen bruger en stjerne (*
) for at vælge alle kolonner fra Dogs
bord. Den tabel har flere kolonner, så fejlen er produceret.
Sådan rettes fejlen
Vi kan rette ovenstående fejl på et par måder.
En måde at løse det på er at erstatte stjernen (*
) med et enkelt kolonnenavn i underforespørgslen:
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Det betyder, at underforespørgslen nu kun returnerer én kolonne i stedet for alle kolonner i tabellen.
En anden måde at rette det på er at gøre, hvad fejlmeddelelsen foreslår, og bruge EXISTS
operator i stedet for IN
.
At gøre dette kræver en lille variation i konstruktionen af forespørgslen:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);
Som du måske forventer, er EXISTS
operator vil også fungere, selvom du kun udtrykkeligt angiver én kolonne:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Men i modsætning til IN
operator, EXISTS
vil også fungere, hvis du eksplicit vælger flere kolonnenavne i underforespørgslen:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);