No SQL Server, você pode usar o
ANY
operador lógico para comparar um valor escalar com um conjunto de valores de coluna única retornado por uma subconsulta. Ele pode ser usado com subconsultas que possuem um conjunto de resultados de uma coluna.
O
ANY
operador é o equivalente do SOME
operador lógico. Exemplo
Suponha que temos duas tabelas;
Cats
e Dogs
Gatos
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Cães
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Agora vamos executar uma subconsulta usando o
ANY
operador. SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs SOME
Teríamos o mesmo resultado se alterássemos a consulta para que ela usasse o
SOME
operador em vez de ANY
. Aqui está usando o
SOME
operador em vez de ANY
. SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs IN
Também podemos usar o
IN
operador para obter o mesmo resultado. SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs EXISTS
Poderíamos fazer a mesma coisa com o
EXISTS
operador. SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Erro 116?
Se você receber o erro 116 ao usar
ANY
, provavelmente é porque você está selecionando várias colunas em sua subconsulta. O ANY
O operador só pode ser usado com subconsultas que tenham um conjunto de resultados de uma coluna. Aqui está um exemplo de como podemos causar esse erro.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT * FROM Dogs);
Resultado:
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.
Nesse sentido, o
ANY
operador é mais semelhante ao IN
operador do que para o EXISTS
operador. Receberíamos o mesmo erro com IN
. Se você precisar retornar várias colunas em sua subconsulta, use
EXISTS
.