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

Sådan rettes "Kun ét udtryk kan angives i valglisten ..." i SQL Server

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


  1. Hvad er SQLite

  2. PL/SQL, hvordan undslipper man et enkelt citat i en streng?

  3. Sådan dræber du alle aktive og inaktive oracle-sessioner for brugeren

  4. En fejl ved estimering af underforespørgsler