Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So beheben Sie „Nur ein Ausdruck kann in der Auswahlliste angegeben werden …“ in SQL Server

In SQL Server tritt Fehlermeldung 116 auf, wenn Sie versuchen, mehrere Spalten in einer Unterabfrage auszuwählen, ohne sie mit EXISTS einzuleiten Betreiber.

Der vollständige Fehler sieht folgendermaßen aus:

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.

Beispiel

Hier ist ein Beispiel für eine Abfrage, die diesen Fehler erzeugt.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName IN (SELECT * FROM Dogs);

Ergebnis:

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.

Das Problem bei dieser Abfrage besteht darin, dass die Unterabfrage ein Sternchen (* ), um alle Spalten der Dogs auszuwählen Tisch. Diese Tabelle hat mehrere Spalten, und daher wird der Fehler erzeugt.

So beheben Sie den Fehler

Wir können den obigen Fehler auf verschiedene Weise beheben.

Eine Möglichkeit, dies zu beheben, besteht darin, das Sternchen (* ) mit einem einzelnen Spaltennamen in der Unterabfrage:

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName IN (SELECT DogName FROM Dogs);

Das bedeutet, dass die Unterabfrage jetzt nur noch eine Spalte statt aller Spalten in der Tabelle zurückgibt.

Eine andere Möglichkeit, dies zu beheben, besteht darin, das zu tun, was die Fehlermeldung vorschlägt, und den EXISTS zu verwenden Operator statt IN .

Dazu ist eine geringfügige Änderung im Aufbau der Abfrage erforderlich:

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);

Wie Sie vielleicht erwarten, ist der EXISTS Der Operator funktioniert auch, wenn Sie nur eine Spalte explizit angeben:

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Aber im Gegensatz zum IN Operator, EXISTS funktioniert auch, wenn Sie explizit mehrere Spaltennamen in der Unterabfrage auswählen:

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);