10 de octubre de 2016

Problema con HAVING

Artículo original: HAVING gotcha
http://www.foxpert.com/knowlbits_200712_1.htm
Autor: Christof Wollenhaupt
Traducido por: Ana María Bisbé York


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.

No hay comentarios. :

Publicar un comentario