En SQL Server, puede usar ANY
operador lógico para comparar un valor escalar con un conjunto de valores de una sola columna devuelto por una subconsulta.
Se puede usar con subconsultas que tienen un conjunto de resultados de una columna.
El ANY
operador es el equivalente de SOME
operador lógico.
Ejemplo
Supongamos que tenemos dos mesas; Cats
y Dogs
Gatos
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Perros
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Ahora ejecutemos una subconsulta usando ANY
operador.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs SOME
Obtendríamos el mismo resultado si tuviéramos que cambiar la consulta para que use el SOME
operador en lugar de ANY
.
Aquí está usando el SOME
operador en lugar de ANY
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
frente a IN
También podríamos usar el IN
operador para obtener el mismo resultado.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs EXISTS
Podríamos hacer lo mismo con 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 | +---------+-----------+
¿Error 116?
Si obtiene el error 116 al usar ANY
, probablemente se deba a que está seleccionando varias columnas en su subconsulta. El ANY
El operador solo se puede usar con subconsultas que tienen un conjunto de resultados de una columna.
Aquí hay un ejemplo de cómo podemos causar este error.
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.
En este sentido, el ANY
el operador es más similar al IN
operador de lo que es para EXISTS
operador. Obtendríamos el mismo error con IN
.
Si debe devolver varias columnas en su subconsulta, use EXISTS
.