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