Operadores de comparación modificados por ANY, SOME o ALL

Los operadores de comparación que presentan una subconsulta se pueden modificar mediante las palabras clave ALL o ANY. SOME es un equivalente del estándar ISO de ANY.

Las subconsultas presentadas con un operador de comparación modificado devuelven una lista de cero o más valores y pueden incluir una cláusula GROUP BY o HAVING. Estas subconsultas se pueden formular con EXISTS.

Si se usa como ejemplo el operador de comparación >, >ALL significa mayor que cualquier valor. Es decir, significa mayor que el valor máximo. Por ejemplo, >ALL (1, 2, 3) significa mayor que 3. >ANY significa mayor que, como mínimo, un valor, es decir, mayor que el mínimo. Entonces, >ANY (1, 2, 3) significa mayor que 1.

Para que una fila de una subconsulta con >ALL satisfaga la condición especificada en la consulta externa, el valor de la columna que presenta la subconsulta debe ser mayor que cada valor de la lista de los valores devueltos por la subconsulta.

De forma parecida, >ANY significa que, para que una fila satisfaga la condición especificada en la consulta externa, el valor de la columna que presenta la subconsulta debe ser mayor que, como mínimo, uno de los valores de la lista devuelta por la subconsulta.

La siguiente consulta proporciona un ejemplo de una subconsulta presentada con un operador de comparación modificado por ANY. Busca los productos cuyos precios de venta sean mayores o iguales que el precio de venta máximo de cualquier subcategoría de producto.

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE ListPrice >= ANY
    (SELECT MAX (ListPrice)
     FROM Production.Product
     GROUP BY ProductSubcategoryID)

Para cada subcategoría de producto, la consulta interna busca el precio de venta máximo. La consulta externa consulta todos estos valores y determina los precios de venta de cada producto que sean mayores o iguales que cualquier precio de venta máximo de la subcategoría de producto. Si ANY se cambia a ALL, la consulta devolverá sólo los productos cuyos precios de venta sean mayores o iguales que todos los precios de venta devueltos en la consulta interna.

Si la subconsulta no devuelve ningún valor, la consulta completa no puede devolver ningún valor.

El operador =ANY es equivalente a IN. Por ejemplo, para buscar los nombres de todos los productos de ruedas que fabrica Adventure Works Cycles, puede usar IN o =ANY.

--Using =ANY
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID =ANY
    (SELECT ProductSubcategoryID
     FROM Production.ProductSubcategory
     WHERE Name = 'Wheels')

--Using IN
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
    (SELECT ProductSubcategoryID
     FROM Production.ProductSubcategory
     WHERE Name = 'Wheels')

Éste es el conjunto de resultados de las consultas:

Name
--------------------------------------------------
LL Mountain Front Wheel
ML Mountain Front Wheel
HL Mountain Front Wheel
LL Road Front Wheel
ML Road Front Wheel
HL Road Front Wheel
Touring Front Wheel
LL Mountain Rear Wheel
ML Mountain Rear Wheel
HL Mountain Rear Wheel
LL Road Rear Wheel
ML Road Rear Wheel
HL Road Rear Wheel
Touring Rear Wheel

(14 row(s) affected)

Sin embargo, el operador < >ANY no es igual que NOT IN: < >ANY significa no = a, no = b, o no = c. NOT IN significa no = a y no = b y no = c. <>ALL significa lo mismo que NOT IN.

Por ejemplo, la siguiente consulta busca los clientes ubicados en un territorio no cubierto por ningún vendedor.

Use AdventureWorks;
GO
SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID <> ANY
    (SELECT TerritoryID
     FROM Sales.SalesPerson)

Los resultados incluyen todos los clientes, salvo aquellos cuyos territorios de ventas sean NULL, porque cada territorio asignado a un cliente está cubierto por un vendedor. La consulta interna busca todos los territorios de ventas cubiertos por los vendedores y, a continuación, para cada territorio, la consulta externa busca los clientes que no están en ninguna.

Por el mismo motivo, cuando se utiliza NOT IN en esta consulta, los resultados no incluyen ningún cliente.

Puede obtener los mismos resultados con el operador < >ALL, que es equivalente a NOT IN.