W SQL Server komunikat o błędzie 116 pojawia się podczas próby wybrania wielu kolumn w podzapytaniu bez wprowadzania go z EXISTS
operatora.
Pełny błąd wygląda tak:
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.
Przykład
Oto przykład zapytania, które powoduje ten błąd.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT * FROM Dogs);
Wynik:
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.
Problem z tym zapytaniem polega na tym, że podzapytanie używa gwiazdki (*
), aby wybrać wszystkie kolumny z Dogs
stół. Ta tabela ma wiele kolumn, więc pojawia się błąd.
Jak naprawić błąd
Powyższy błąd możemy naprawić na kilka sposobów.
Jednym ze sposobów, aby to naprawić, jest zastąpienie gwiazdki (*
) z nazwą pojedynczej kolumny w podzapytaniu:
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Oznacza to, że podzapytanie zwraca teraz tylko jedną kolumnę zamiast wszystkich kolumn w tabeli.
Innym sposobem, aby to naprawić, jest zrobienie tego, co sugeruje komunikat o błędzie i użycie EXISTS
operator zamiast IN
.
Wykonanie tego wymaga niewielkich zmian w konstrukcji zapytania:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT * FROM Dogs d
WHERE c.CatName = d.DogName);
Jak można się spodziewać, EXISTS
operator również zadziała, nawet jeśli wyraźnie określisz tylko jedną kolumnę:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Ale w przeciwieństwie do IN
operator, EXISTS
zadziała również, jeśli wyraźnie wybierzesz wiele nazw kolumn w podzapytaniu:
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);