В SQL Server можете да използвате ANY
логически оператор за сравнение на скаларна стойност с набор от стойности от една колона, върнати от подзаявка.
Може да се използва с подзаявки, които имат набор от резултати от една колона.
ANY
операторът е еквивалент на SOME
логически оператор.
Пример
Да приемем, че имаме две таблици; 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 = ANY (SELECT DogName FROM Dogs);
Резултат:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
срещу SOME
Ще получим същия резултат, ако променим заявката, така че да използва SOME
оператор вместо ANY
.
Тук се използва SOME
оператор вместо ANY
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Резултат:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
срещу IN
Можем също да използваме IN
оператор, за да получите същия резултат.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Резултат:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
срещу 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, когато използвате ANY
, вероятно защото избирате няколко колони в подзаявката си. ANY
операторът може да се използва само с подзаявки, които имат набор от резултати от една колона.
Ето пример за това как можем да причиним тази грешка.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (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.
В този смисъл ANY
операторът е по-подобен на IN
оператор, отколкото е към EXISTS
оператор. Ще получим същата грешка с IN
.
Ако трябва да върнете няколко колони във вашата подзаявка, използвайте EXISTS
.