
استفاده از SQL WITH clause در اوراکل
مورد کاربرد WITH در Oracle:
معمولا WITH clause را Subquery Factoring نيز مي نامند
استفاده از SQL WITH clause خيلي شبيه استفاده از (Global temporary tables (GTT مي باشد
اين تكنيك اغلب براي بهبود افزايش سرعت كوئري براي subqueries پيچيده استفاده مي شود
استفاده از SQL WITH clause موقعي كه يك subquery داشته باشيم كه چندين بار تكرار شود
هنگام استفاده از recursive queries مفيد مي باشد
در Oracle 12c امكان ايجاد فانكشن در داخل WITH clause امكان پذير مي باشد
براي درك بهتر از چند مثال استفاده مي كنيم.
SELECT e.ename AS employee_name,
dc.dept_count AS emp_dept_count
FROM emp e,
(SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno) dc
WHERE e.deptno = dc.deptno
dc.dept_count AS emp_dept_count
FROM emp e,
(SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno) dc
WHERE e.deptno = dc.deptno
حال با استفاده از WITH clause در اوراکل
WITH dept_count AS (
SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno)
SELECT e.ename AS employee_name,
dc.dept_count AS emp_dept_count
FROM emp e,
dept_count dc
WHERE e.deptno = dc.deptno
SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno)
SELECT e.ename AS employee_name,
dc.dept_count AS emp_dept_count
FROM emp e,
dept_count dc
WHERE e.deptno = dc.deptno
WITH
subquery_name
AS
(the aggregation SQL statement)
SELECT
(query naming subquery_name)
حال مثال زير را در قالب بالا قرار مي دهيم.
WITH sum_sales AS
( select sum(qty) all_sales from sales ),
number_stores AS
( select count(*) nbr_stores from stores ),
sales_by_store AS
( select stor_name, sum(qty) store_sales from
stores natural join sales
group by stor_name)
SELECT stores.stor_name
FROM stores,
sum_sales,
number_stores,
sales_by_store
where store_sales > (all_sales / nbr_stores)
( select sum(qty) all_sales from sales ),
number_stores AS
( select count(*) nbr_stores from stores ),
sales_by_store AS
( select stor_name, sum(qty) store_sales from
stores natural join sales
group by stor_name)
SELECT stores.stor_name
FROM stores,
sum_sales,
number_stores,
sales_by_store
where store_sales > (all_sales / nbr_stores)
