I SQL Server uppstår felmeddelande 116 när du försöker välja flera kolumner i en underfråga utan att införa den med koden EXISTS
operatör.
Hela felet ser ut så här:
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.
Exempel
Här är ett exempel på en fråga som ger det här felet.
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 den här frågan är att underfrågan använder en asterisk (*
) för att välja alla kolumner från Dogs
tabell. Den tabellen har flera kolumner, så felet skapas.
Hur du åtgärdar felet
Vi kan fixa ovanstående fel på ett par sätt.
Ett sätt att fixa det är att ersätta asterisken (*
) med ett enda kolumnnamn i underfrågan:
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Det betyder att underfrågan nu bara returnerar en kolumn istället för alla kolumner i tabellen.
Ett annat sätt att fixa det är att göra vad felmeddelandet föreslår och använda EXISTS
operator istället för IN
.
Att göra detta kräver en liten variation i konstruktionen av frågan:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);
Som du kan förvänta dig, EXISTS
operatorn kommer också att fungera även om du bara uttryckligen anger en kolumn:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Men i motsats till IN
operator, EXISTS
fungerar också om du uttryckligen väljer flera kolumnnamn i underfrågan:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);