Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Explicação do operador SQL Server ANY


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 .