Hola invitado         31 Jul, 2010 - 07:35
Menú principal
 
Ads
 
Patrocinadores
 
Anuncios
 
© 2009 PortalFox
Problema con HAVING (Christof Wollenhaupt) Traducción lecturas 1516
 Enviado por amby en Lunes, 24 Marzo, 2008
Artículos Christof nos expone un problema y su solución, referido esta vez al tratamiento de los nombres de campos por la cláusula HAVING.

Problema con HAVING

Artículo original: HAVING gotcha
http://www.foxpert.com/knowlbits_200712_1.htm
Autor: Christof Wollenhaupt (http://www.foxpert.com/knowlbits.htm)
Traducido por: Ana María Bisbé York (amby@telefonica.net)
Para: PortalFox (http://www.portalfox.com)


Sin la cláusula GROUP BY, HAVING opera de forma similar que una cláusula WHERE, excepto en que el filtro opera en el conjunto resultante:

Create Cursor curSrc (Fld1 I, Fld2 I)
Insert into curSrc values (1, 1)
Insert into curSrc values (2, 2)

Select Fld1, fld1 + 1 as Fld3 ;
  From curSrc ;
  having Fld3 = 2

En este ejemplo, la consulta solamente devuelve aquellos registros donde la expresión "FLD+1" es 2. La capacidad de consultar campos en el conjunto resultante es limitada. Puede consultar solamente los campos que no aparecen en una de las tablas origen. Volviendo a escribir la consulta como esta obtenemos un resultado diferente. La única diferencia en la sentencia es que FLD3 ahora se llama FLD2:

Select Fld1, fld1 + 1 as Fld2 ;
  From curSrc ;
  having fld2 = 2

FLD2 se utiliza solamente en un alias en la lista de campos, todavía la cláusula HAVING opera sobre curScr.Fld2 en lugar de FLD2 del conjunto resultante. Esto puede ocasionar cambios de comportamiento del programa cuando agregue un campo a la tabla con el mismo nombre que una columna calculada.

Una vez que agrega el conjunto resultante con GROUP BY, las reglas cambian ligeramente. Refiriéndose al nombre del campo en el conjunto resultante, si existe un campo con el mismo nombre en cualquiera de las tablas origen, provoca un mensaje de error. En la siguiente consulta, FLD1 + 1 = 2 trabaja en la cláusula HAVING, FLD2=2 no podría:

Select Fld1, fld1 + 1 as Fld2 ;
  From curSrc ;
  group by 1, 2 ;
  having fld1 + 1 = 2

La misma consulta es válida si el nombre del campo no existe en cualquiera de las tablas origen. La siguiente consulta utiliza FLD3 en lugar de FLD2 como nombre del campo:

Select Fld1, fld1+1 as Fld3 ;
  From curSrc ;
  group by 1, 2 ;
  having fld3 = 2

Esta es una situación que podría encontrar cuando hace refactorización y se renombran los campos. Cambiar el nombre del campo local sorprendentemente causa error cuando se ejecuta la consulta.


 Versión imprimible  
Problema con HAVING (Christof Wollenhaupt) Traducción | Entrar/Crear una cuenta | 0 Comentarios
Los comentarios son propiedad de sus respectivos autores.
No somos responsables de su contenido.



Todas las marcas y los logos utilizados en este sitio son propiedad de sus respectivos dueños.
Los artículos, noticias y comentarios son propiedad y responsabilidad de sus respectivos autores.
Copyright © 2000-2010 PortalFox. Todos los derechos reservados.