martes, 14 de enero de 2014

Reusar un Select gracias a la clausula With


La sentencia WITH se añadió a la sintaxis SQL de Oracle en Oracle 9.2. 

La cláusula WITH se puede procesar como una vista en línea, crea una tabla temporal. La ventaja de esto último es que las referencias repetidas a la subconsulta pueden ser más eficientes ya que los datos se recuperan fácilmente de la tabla temporal, en lugar de ser consultados por cada referencia. La variación en el rendimiento puede ser mayor o menor según el caso, pero para simplificar un query que tiene varias subconsultas siempre es muy útil.

En este artículo se muestra cómo la cláusula WITH se puede utilizar para reducir la repetición y simplificar las sentencias SQL complejas. Puede que los ejemplos no sean la mejor manera de hacer esta consulta en particular sirve para poder explicar el uso de la clausula WITH.

WITH AVG_AREA AS(
SELECT AREA,
 AVG(SALARIO) AVG_SALARIO
FROM EMPLEADOS
GROUP BY AREA )

SELECT CEDULA, AREA, SALARIO, AVG_SALARIO, SALARIO-AVG_SALARIO VARIACION
FROM EMPLEADOS M, AVG_AREA A
WHERE M.AREA = A.AREA;


Con el ejemplo podemos apreciar la sintaxis, inicialmente con la clausula with
el subquery que se crea y luego de este el query principal donde se usa el subquery ya renombrado.

Es posible tener varias clausulas With, basta separarlas con comas. Así:

WITH AVG_AREA AS(
SELECT AREA,
 AVG(SALARIO) AVG_SALARIO
FROM EMPLEADOS
GROUP BY AREA ),

AVG_EMPRESA AS(
SELECT AVG(SALARIO) AVG_TOTAL
FROM EMPLEADOS)

SELECT CEDULA, AREA, SALARIO, SALARIO-AVG_SALARIO VARIACION_AREA,
SALARIO-AVG_TOTAL VARIACION_EMPRESA
FROM EMPLEADOS M, AVG_AREA A, AVG_EMPRESA E
WHERE M.AREA = A.AREA;

Es importante anotar que todos las subconsultas que se incluyan en el With
deben usarse en la consulta principal sino nos dará el error 
ORA-01762 View query block not in from

No hay comentarios:

Publicar un comentario