W SQL Server możesz użyć SOME
operator logiczny do porównania wartości skalarnej z jednokolumnowym zestawem wartości zwracanych przez podzapytanie.
Może być używany z podzapytaniami, które mają zestaw wyników składający się z jednej kolumny.
SOME
operator jest odpowiednikiem ANY
operator logiczny.
Przykład
Wyobraź sobie, że mamy dwa stoły; Cats
i Dogs
Koty
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Psy
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Teraz uruchommy podzapytanie za pomocą ANY
operatora.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Wynik:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
kontra ANY
Jak wspomniano, SOME
jest odpowiednikiem ANY
.
Możemy więc zmienić nasze zapytanie tak, aby używało ANY
zamiast SOME
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Wynik:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs IN
Otrzymalibyśmy ten sam wynik, gdybyśmy zmienili zapytanie tak, aby używało IN
operator zamiast SOME
.
Tutaj używa IN
operatora.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Wynik:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs EXISTS
Moglibyśmy zrobić to samo z EXISTS
operatora.
Tutaj używa EXISTS
operatora.
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Wynik:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Błąd 116?
Jeśli pojawi się błąd 116 podczas używania SOME
, prawdopodobnie dlatego, że wybierasz wiele kolumn w podzapytaniu. SOME
Operator może być używany tylko z podzapytaniami, które mają zestaw wyników składający się z jednej kolumny.
Oto przykład tego, jak możemy spowodować ten błąd.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (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.
Otrzymalibyśmy ten sam błąd z IN
. Jeśli musisz zwrócić wiele kolumn w podzapytaniu, użyj EXISTS
.