一般來講,如果你有一個情況下,我們需要在同一subquery
多次重新定義,而是直接使用已定義的查詢名稱WITH子句,使查詢更容易閱讀。也許,這就是爲什麼它被稱爲subquery factoring
例如,
使用SCOTT模式,爲每一位員工,我們想知道其他人有多少是在他們的部門。使用內聯視圖,我們可以執行以下操作。
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;
使用WITH子句如下所示。
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 e.ename AS employee_name,
dc1.dept_count AS emp_dept_count,
m.ename AS manager_name,
dc2.dept_count AS mgr_dept_count
FROM emp e,
(SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno) dc1,
emp m,
(SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno) dc2
WHERE e.deptno = dc1.deptno
AND e.mgr = m.empno
AND m.deptno = dc2.deptno;
使用WITH子句,如下所示。
WITH dept_count AS (
SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno)
SELECT e.ename AS employee_name,
dc1.dept_count AS emp_dept_count,
m.ename AS manager_name,
dc2.dept_count AS mgr_dept_count
FROM emp e,
dept_count dc1,
emp m,
dept_count dc2
WHERE e.deptno = dc1.deptno
AND e.mgr = m.empno
AND m.deptno = dc2.deptno;
因此,底線是,我們不需要多次重新定義相同的子查詢。相反,我們只需使用WITH子句中定義的查詢名稱,使查詢更容易閱讀。
更多詳細信息here
這是一個通用表格表達式(也稱爲CTE)。它與from子句中的派生表沒有什麼不同,只是更容易閱讀。 – Andrew 2014-10-09 15:38:10
也稱爲[subquery factoring](http://docs.oracle.com/cd/E11882_01/server.112/e10592/statements_10002.htm#i2077142)。 – 2014-10-09 15:55:32