В 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 .