Unidad 6. Las subconsultas (IV)


6.5. La comparación modificada (ANY, ALL)

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

Se utiliza este tipo de comparación cuando queremos comparar el resultado de la expresión con una lista de valores y actuar en función del modificador empleado.

El test ANY

<expresion>  {=|<>|!=|>|>=|!>|<|<=|!<} {ANY|SOME} subconsulta

ANY significa que, para que una fila de la consulta externa satisfaga la condición especificada, la comparación se debe cumplir para al menos un valor de los devueltos por la subconsulta.

Por cada fila de la consulta externa se evalúa la comparación con cada uno de los valores devueltos por la subconsulta y si la comparación es True para alguno de los valores ANY es verdadero, si la comparación no se cumple con ninguno de los valores de la consulta, ANY da False a no ser que todos los valores devueltos por la subconsulta sean nulos en tal caso ANY dará NULL.
Si la subconsulta no devuelve filas ANY da False incluso si expresion es nula.

Ejemplo:

SELECT *

FROM empleados

WHERE cuota > ANY (SELECT cuota 

			FROM empleados empleados2

			WHERE empleados.oficina = empleados2.oficina);

Obtenemos los empleados que tienen una cuota superior a la cuota de alguno de sus compañeros de oficina, es decir los empleados que no tengan la menor cuota de su oficina.

En este caso hemos tenido un alias de tabla en la subconsulta (empleados2) para poder utilizar una referencia externa.

Para practicar puedes realizar este Ejercicio Comparación modificada ANY.

El test ALL


<expresion>  {=|<>|!=|>|>=|!>|<|<=|!<} ALL subconsulta

Con el modificador ALL, para que se cumpla la condición, la comparación se debe cumplir con cada uno de los valores devueltos por la subconsulta.
Si la subconsulta no devuelve ninguna fila ALL da True.

SELECT *

FROM empleados

WHERE cuota > ALL (SELECT cuota 

			FROM empleados empleados2

			WHERE empleados.oficina = empleados2.oficina);

En el ejemplo anterior obtenemos los empleados que tengan una cuota superior a todas las cuotas de la oficina del empleado. Podríamos pensar que obtenemos el empleado de mayor cuota de su oficina pero no lo es, aquí tenemos un problema, la cuota del empleado aparece en el resultado de subconsulta por lo tanto > no se cumplirá para todos los valores y sólo saldrán los empleados que no tengan oficina (para los que la subconsulta no devuelve filas).

Para salvar el problema tendríamos que quitar del resultado de la subconsulta la cuota del empleado modificando el WHERE:


WHERE empleados.oficina = empleados2.oficina 

      AND empleados.numemp <> empleados2.numemp);

De esta forma saldrían los empleados que tienen una cuota mayor que cualquier otro empleado de su misma oficina.

O bien

WHERE empleados.oficina = empleados2.oficina 

		 AND empleados.cuota <> empleados2.cuota);

Para no considerar los empleados que tengan la misma cuota que el empleado. En este caso saldrían los empleados con la mayor cuota de sus oficina, pero si dos empleados tienen la misma cuota superior, saldrían, hecho que no sucedería con la otra versión.

Cuando la comparación es una igualdad, = ANY es equivalente a IN y <> ALL es equivalente a NOT IN (con los mismos problemas).

Febrero-2010
Pág. 6.4

Atrás  Inicio  Adelante



.