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.
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