Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come risolvere "È possibile specificare solo un'espressione nell'elenco di selezione..." in SQL Server

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);