Вы находитесь на странице: 1из 3

13.2.8.2.

Uso de subconsultas en subconsultas


El uso ms comn de una subconsulta es de la forma:
non_subquery_operand comparison_operator (subquery)

Donde comparison_operator es uno de estos operadores:


= > < >= <= <>

Por ejemplo:
... 'a' = (SELECT column1 FROM t1)

Tiempo atrs el nico sitio legal para una subconsulta era la parte derecha de la comparacin, y puede encontrar algunos SGBDs que insistan en ello. He aqu un ejemplo de una comparacin comn de subconsultas que no puede hacerse mediante un join. Encuentra todos los valores en la tabla t1 que son iguales a un valor mximo en la tabla t2:
SELECT column1 FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2);

Aqu hay otro ejemplo, que de nuevo es imposible de hacer con un join ya que involucra agregacin para una de las tablas. Encuentra todos los registros en la tabla t1 que contengan un valor que ocurre dos veces en una columna dada:
SELECT * FROM t1 AS t WHERE 2 = (SELECT COUNT(*) FROM t1 WHERE t1.id = t.id);

Para una comparacin realizada con uno de estos operadores, la subconsulta debe retornar un escalar, con la excepcin que = puede usarse con subconsultas de registro. Consulte Seccin 13.2.8.5, Subconsultas de registro.

13.2.8.3. Subconsultas con ANY, IN y SOME


Sintaxis:
operand comparison_operator ANY (subquery) operand IN (subquery) operand comparison_operator SOME (subquery)

La palabra clave ANY , que debe seguir a un operador de comparacin, significa return TRUE si la comparacin es TRUE para ANY (cualquiera) de los valores en la columna que retorna la subconsulta. Por ejemplo:
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);

Suponga que hay un registro en una tabla t1 que contiene (10). La expresin es TRUE si la tabla t2 contiene (21,14,7) ya que hay un valor 7 en t2 que es menor que 10. La expresin es FALSE si la tabla t2 contiene (20,10), o si la tabla t2 est vaca. La expresin es UNKNOWN si la tabla t2 contiene (NULL,NULL,NULL). La palabra IN es un alias para = ANY. Por lo tanto, estos dos comandos son lo mismo:
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);

Sin embargo, NOT IN no es un alias para <> ANY, sino para <> ALL. Consulte Seccin 13.2.8.4, Subconsultas con ALL. La palabra SOME es un alias para ANY. Por lo tanto, estos dos comandos son el mismo:
SELECT s1 FROM t1 WHERE s1 <> ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);

El uso de la palabra SOME es raro, pero este ejemplo muestra cmo puede ser til. Para la mayora de gente, la frase en ingls a is not equal to any b significa there is no b which is equal to a, pero eso no es lo que quiere decir la sintaxis SQL. La sintaxis significa there is some b to which a is not equal. Usando <> SOME en su lugar ayuda a asegurar que todo el mundo entiende el significado de la consulta.

13.2.8.4. Subconsultas con ALL


Sintaxis:
operand comparison_operator ALL (subquery)

La palabra ALL, que debe seguir a un operador de comparacin, significa return TRUE si la comparacin es TRUE para ALL todos los valores en la columna que retorna la subconsulta. Por ejemplo:
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);

Suponga que hay un registro en la tabla t1 que contiene (10). La expresin es TRUE si la tabla t2 contiene (-5,0,+5) ya que 10 es mayor que los otros tres valores en t2. La expresin es FALSE si la tabla t2 contiene (12,6,NULL,100) ya que hay un nico valor 12 en la tabla t2 mayor que 10. La expresin es UNKNOWN si la tabla t2 contiene (0,NULL,1).

Finalmente, si la tabla t2 est vaca, el resultado es TRUE. Puede pensar que el resultado debera ser UNKNOWN, pero lo sentimos, es TRUE. As, aunque extrao, el siguiente comando es TRUE cuando la tabla t2 est vaca:
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);

Pero este comando es UNKNOWN cuando la tabla t2 est vaca:


SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);

Adems, el siguiente comando es UNKNOWN cuando la tabla t2 est vaca:


SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);

En general, las tablas con valores NULL y las tablas vacas son casos extremos. Al escribir cdigo para subconsultas, siempre considere si ha tenido en cuenta estas dos posibilidades.
NOT IN es un alias para <> ALL. Por lo tanto, estos dos comandos son equivalentes:
SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);

Вам также может понравиться