sql >> Databáze >  >> RDS >> Sqlserver

Jak opravit „V seznamu výběru lze zadat pouze jeden výraz…“ na serveru SQL Server

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


  1. Příkaz SQL INSERT INTO

  2. Požadavky na obnovu před zálohováním

  3. Nastavte výchozí hodnotu pro sloupec v SQLite:DEFAULT Constraint

  4. Jsou primární klíče passé?