In SQL Server, il messaggio di errore 116 viene visualizzato quando si tenta di selezionare più colonne in una sottoquery senza introdurla con EXISTS
operatore.
L'errore completo è simile al seguente:
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.
Esempio
Ecco un esempio di una query che produce questo errore.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT * FROM Dogs);
Risultato:
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.
Il problema con questa query è che la sottoquery utilizza un asterisco (*
) per selezionare tutte le colonne da Dogs
tavolo. Quella tabella ha più colonne, quindi viene prodotto l'errore.
Come correggere l'errore
Possiamo correggere l'errore di cui sopra in un paio di modi.
Un modo per risolverlo è sostituire l'asterisco (*
) con un unico nome di colonna nella sottoquery:
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Ciò significa che la sottoquery ora restituisce solo una colonna invece di tutte le colonne della tabella.
Un altro modo per risolverlo è eseguire ciò che suggerisce il messaggio di errore e utilizzare EXISTS
operatore invece di IN
.
Ciò richiede una leggera variazione nella costruzione della query:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);
Come puoi immaginare, il EXISTS
l'operatore funzionerà anche se indichi esplicitamente solo una colonna:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Ma in contrasto con IN
operatore, EXISTS
funzionerà anche se selezioni esplicitamente più nomi di colonna nella sottoquery:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);