Clauza WITH

    Prin utilizarea  clauzei WITH  se poate defini  un bloc de interogare  inainte de a-l utiliza intr-o interogare. Clauza WITH (cunoscuta  sub denumirea de subquery_factoring_clause)  permite refolosirea unui bloc de interogare intr-o fraza SELECT  atunci cand acesta trebuie sa apara de mai multe ori intr-o interogare complexa. Este utilã  in cazul in care o interogare  se refera de mai multe ori la acelasi bloc, si cand contine  jonctiuni si agregari.
    Clauza WITH salveaza  rezultatele unui bloc de interogare  si le memoreazã  intr-un spatiu de tabele utilizator temporar, ca urmare ea  imbunatateste performantele.

Exemplu: Sa se scrie o interogare care afisaza numele  departamentelor si  totalul salariilor  pentru acele departamente al cãror total pentru salarii  este mai mare decat media salariilor pe toate departamentele.
Rezolvarea acestei probleme ar  solicita urmatoarele calcule intermediare:
- calculul totalului salariilor pentru fiecare departament si memorarea rezultatului  utilizand clauza WITH
- calculul  mediei salariilor pentru toate departamentele  si memorarea rezultatului cu ajutorul clauzei WITH
- se compara  totalul salariilor calculat in primul pas cu  media salariilor  calculata in pasul doi. Daca  totalul salariilor pentru un anumit departament  este mai mare decat salariul mediu  se va afisa numele departamentului si  totalul salariilor pentru acel departament

WITH
dept_costs AS (
                    SELECT d.department_name. SUM(e.salary) AS dept_total
                    FROM employees e, departments d
                    WHERE  e.department_id=d.department_id
                    GROUP BY d.department_name),
avg_cost AS (
                    SELECT SUM(dept_total)/count (*) AS dept_avg
                    FROM dept_costs)
SELECT *
FROM dept_costs
WHERE  dept_total >
                        (SELECT  dept_avg
                        FROM avg_cost)
ORDER BY department_name;

Observatii:
- clauza WITH se utilizraza numai cu fraze SELECT
- un nume  de interogare este vizibil  tuturor  elementelor blocurilor de interogare definite dupã el, precum si  blocului de interogare principal (inclusiv subinterogarilor sale).
- clauza WITH poate pastra  mai multre interogari separate prin virgula.