Desarrollando en Cobol y Natural sobre Plataforma Mainframe

jueves, 23 de abril de 2015

Como crear una Subquery DB2 con SQL

A la hora de acceder a DB2, cuando precisamos realizar algún filtrado relativamente complejo, lo más probable es que no tengamos suficiente con la implementación de una query simple. En estos casos, no nos va a quedar más remedio que recurrir al empleo de subqueries.

¿Qué es una subquery de SQL? Básicamente, una subquery no es más que una query anidada dentro de otra Query de orden superior. Normalmente, las subqueries se incorporan en la cláusula WHERE y se utilizan para extraer una serie de valores que luego vamos a utilizar para la ejecución de la Query superior.



Esto se ve más claramente con un ejemplo, así que a continuación incorporamos un fragmento de código que incorpora una subquery.

SELECT * 
FROM JJCABLT0 A, JJPEDIT0 B       
WHERE A.SITUACION IN                             
               (SELECT DISTINCT SITUACION

                FROM JJPEDIT0         
                WHERE CENTRO = 'ZARAGOZA')
      AND B.CENTRO = 'ZARAGOZA'                          
      AND A.SITUACION = B.SITUACION                
      AND A.PEDIDO = B.PEDIDO               


En la query anterior estamos buscando registros en el fichero CABL que cumplan con unos determinados criterios en los campos SITUACION, CENTRO y PEDIDO. Las cláusulas de CENTRO y PEDIDO no merecen mayor comentario, pues hacen referencia a declaraciones SQL simples que ya hemos visto en muchas otras ocasiones.

En cuanto al campo SITUACION, vemos que está incluido en una sentencia definida como A.SITUACION IN (...). Lo curioso es que el contenido de la cláusula IN (...) no se corresponde con códigos númericos o alfanuméricos, sino que en su interior aparece definida (anidada) otra query completa. Esta query interna es lo que se conoce como subquery.

SELECT DISTINCT SITUACION
FROM JJPEDIT0         
WHERE CENTRO = 'ZARAGOZA'


La ejecución de la subquery devolverá una serie de valores del campo SITUACION, los cuales serán utilizados para realizar el filtrado de la cláusula WHERE de la Query superior. Dicho de otro modo, la query principal buscará todos aquellos registros cuyo campo SITUACION coincida con alguno de los códigos devueltos por la query subordinada.

Si ejecutásemos la subquery por separado, el resultado que nos retornaría sería el siguiente (en este caso se trata de un registro único, pero podrían haber sido varios).

 SITUACION
 ---------
    500001


Por tanto, la ejecución de la Query principal buscará todos los registros de la tabla CABL cuyo campo SITUACION sea igual al valor 500001. A continuación, mostramos las líneas que se obtienen si lanzamos la query completa.



Como vemos, todos los registros mostrados aparecen con SITUACION igual a 500001, cosa que coincide con el resultado esperado. El resto de páginas del listado, pese a que no se ve en la imagen, también cumple con esa condición.

Aunque en el post hemos puesto como ejemplo un caso muy sencillo, esta es la estructura básica con la que deben implementarse una Query y sus subqueries anidadas. Obviamente, en las aplicaciones de nuestros clientes nos iremos encontrando con codificaciones más complejas pero, en realidad, estarán basadas en esta misma configuración. Otro día, en un nuevo post, os mostraremos un caso en el que se ilustre la dificultad que puede llegar a alcanzar una query de este tipo.

Eso es todo. Esperamos que lo comentado valga para despertar el interés por el mundo de las subqueries DB2. Al menos, os puede servir como punto de partida para ir ampliando vuestro conocimiento posteriormente.

Saludos.

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...