一般来讲,如果你有一个情况下,我们需要在同一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