lunes, 28 de septiembre de 2015

Subquery para recuperar varios campos a la vez

Del mismo modo que podemos obtener un campo individual, las subqueries SQL también nos sirven para recuperar varios campos a la vez de las tablas DB2. Esta operativa nos será útil en numerosas ocasiones, ya que nos permitirá ahorrarnos gran parte del código que tendríamos que emplear para extraer los datos uno a uno.

Subquery para recuperar varios campos a la vez


En general, cuando codificamos una subquery (una query anidada dentro de otra query SQL), lo que solemos hacer es crear una sentencia que nos permita acceder a un dato concreto. Este tipo de acceso habrá sido utilizado varias veces por cualquier programador Cobol que lleve más de un año utilizando el QMF de SQL.


Un ejemplo del tipo de subquery SQL DB2 sencilla al que me refiero es el que os incluyo aquí a continuación, donde la utilizamos para recuperar el campo SITUACION.

SELECT * FROM JJTRAMT0 A
WHERE A.SITUACION IN                             
     (SELECT DISTINCT SITUACION                     
      FROM JJLOCAT0                                      
      WHERE LOCALIZACION = ‘VITORIA’) 


Pues bien, en algunas ocasiones nos vamos a encontrar con problemas más complejos en el mantenimiento de nuestra aplicación y, en esos casos, nos ahorraremos bastante trabajo si implementamos una query que sea capaz de recuperar más de un campo del fichero DB2. En el ejemplo anterior, este escenario podría ser el de intentar recuperar mediante la subquery los campos SITUACION y LOCALIZACION del fichero LOCA.

Es posible que, en vuestros clientes, nunca lleguéis a encontraros en una situación en la que tengáis la necesidad de hacer una subquery tan elaborada. A pesar de todo, nunca está de más saber cómo se hace. Quizás os sea útil en el futuro.

¿Cómo recuperar varios campos a la vez del DB2?


Implementar una subquery que recupere varios campos del fichero DB2 a la vez es un procedimiento que, una vez conocido, resulta bastante sencillo de replicar. Digamos que la complejidad de este tipo de subquery tiene su origen en que no suele utilizarse asiduamente y no en que sea algo intrínsecamente complicado de desarrollar.


Para elaborar este tipo de estructura simplemente tendremos que recurrir al uso del operador || en la subquery. Dicho operador sirve, precisamente, para combinar varios campos DB2 y permitir su recuperación conjunta desde una query hija hacia su query padre. A continuación, podemos ver un ejemplo de este tipo de codificación.

SELECT * FROM JJTRAMT0 A
WHERE A.SITUACION || A.LOCALIZACION IN              
    (SELECT SITUACION || LOCALIZACION

      FROM JJLOCAT0                                      
      WHERE LOCALIZACION = ‘VITORIA’)  


Como se puede observar, en el caso anterior estamos obteniendo los campos SITUACION y LOCALIZACION en la subquery. Estos datos se combinan mediante el operador || y, posteriormente, se transfieren a la query padre en la cláusula SITUACION || LOCALIZACION.

Esta implementación nos permitirá operar en la query padre con los campos SITUACION y LOCALIZACION cuyo contenido coincida con el de los campos SITUACION y LOCALIZACION existentes en la subquery. Dicho de otro modo, la query padre recuperará los registros del fichero TRAM cuyos valores en los campos SITUACION y LOCALIZACION coincidan con alguno de los valores recuperados del fichero LOCA mediante la subquery.

Obviamente, el código anterior se puede complicar tanto como se precise, pero la idea básica de utilización del operador || es la mostrada en las sencillas declaraciones anteriores. De todas formas, si tenéis alguna duda dejad la pregunta en los comentarios e intentaré responderos en cuanto tenga oportunidad.


Conclusiones acerca del operador ||


En general, en las subqueries que construyamos nos bastará con recuperar un único campo de los ficheros DB2. Pero, tal y como hemos visto en el post, siempre que sea necesario, el operador || nos dará la oportunidad de transferir varios campos a la vez desde una subquery hasta su query padre. Aunque hasta ahora no os hayáis encontrado con dicha situación, es posible que este conocimiento os sea útil en el futuro.

Pues nada, no queda mucho más que decir acerca de este tipo especial de subquery. Espero que lo comentado os haya servido para aprender algo nuevo y útil para vuestro trabajo.

Saludos.

No hay comentarios:

Publicar un comentario