V SQL Server se při pokusu o výběr více sloupců v poddotazu, aniž by byl uveden pomocí EXISTS
, zobrazí chybová zpráva 116 operátor.
Úplná chyba vypadá takto:
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.
Příklad
Zde je příklad dotazu, který způsobuje tuto chybu.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT * FROM Dogs);
Výsledek:
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.
Problém s tímto dotazem je, že poddotaz používá hvězdičku (*
) vyberte všechny sloupce z Dogs
stůl. Tato tabulka má více sloupců, takže dojde k chybě.
Jak opravit chybu
Výše uvedenou chybu můžeme opravit několika způsoby.
Jedním ze způsobů, jak to opravit, je nahradit hvězdičku (*
) s jedním názvem sloupce v poddotazu:
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
To znamená, že poddotaz nyní vrací pouze jeden sloupec namísto všech sloupců v tabulce.
Dalším způsobem, jak to opravit, je udělat to, co navrhuje chybová zpráva, a použít EXISTS
operátor namísto IN
.
To vyžaduje mírnou změnu v konstrukci dotazu:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);
Jak můžete očekávat, EXISTS
Operátor bude také fungovat, i když explicitně uvedete pouze jeden sloupec:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Ale na rozdíl od IN
operátor EXISTS
bude také fungovat, pokud v poddotazu explicitně vyberete více názvů sloupců:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);