В SQL Server можете да използвате SOME
логически оператор за сравнение на скаларна стойност с набор от стойности от една колона, върнати от подзаявка.
Може да се използва с подзаявки, които имат набор от резултати от една колона.
SOME
операторът е еквивалент на ANY
логически оператор.
Пример
Представете си, че имаме две маси; Cats
и Dogs
Котки
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Кучета
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Сега нека изпълним подзаявка с помощта на ANY
оператор.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Резултат:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
срещу ANY
Както споменахме, SOME
е еквивалент на ANY
.
Така че бихме могли да променим нашата заявка да използва ANY
вместо SOME
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Резултат:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
срещу IN
Ще получим същия резултат, ако променим заявката така, че да използва IN
оператор вместо SOME
.
Тук той използва IN
оператор.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Резултат:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
срещу EXISTS
Бихме могли да направим същото с EXISTS
оператор.
Тук той използва EXISTS
оператор.
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Резултат:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Грешка 116?
Ако получите грешка 116, когато използвате SOME
, вероятно защото избирате няколко колони в подзаявката си. SOME
операторът може да се използва само с подзаявки, които имат набор от резултати от една колона.
Ето пример за това как можем да причиним тази грешка.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT * FROM Dogs);
Резултат:
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.
Ще получим същата грешка с IN
. Ако трябва да върнете няколко колони във вашата подзаявка, използвайте EXISTS
.