In SQL Server treedt foutbericht 116 op wanneer u probeert meerdere kolommen in een subquery te selecteren zonder deze te introduceren met de EXISTS
telefoniste.
De volledige fout ziet er als volgt uit:
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.
Voorbeeld
Hier is een voorbeeld van een zoekopdracht die deze fout veroorzaakt.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT * FROM Dogs);
Resultaat:
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.
Het probleem met deze query is dat de subquery een asterisk gebruikt (*
) om alle kolommen uit de Dogs
. te selecteren tafel. Die tabel heeft meerdere kolommen, en dus wordt de fout geproduceerd.
Hoe de fout op te lossen
We kunnen de bovenstaande fout op een aantal manieren oplossen.
Een manier om dit op te lossen is door het sterretje (*
) met een enkele kolomnaam in de subquery:
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Dit betekent dat de subquery nu slechts één kolom retourneert in plaats van alle kolommen in de tabel.
Een andere manier om het op te lossen, is door te doen wat de foutmelding suggereert en de EXISTS
. te gebruiken operator in plaats van IN
.
Hiervoor is een kleine variatie in de constructie van de zoekopdracht vereist:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);
Zoals je mag verwachten, bestaat de EXISTS
operator werkt ook, zelfs als u slechts één kolom expliciet vermeldt:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Maar in tegenstelling tot de IN
operator, EXISTS
werkt ook als u expliciet meerdere kolomnamen selecteert in de subquery:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);