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 .