oracle的with语法
1. 
With语句的语法
Oracle在9i中引入了with语句。with语句用来给查询语句中的子查询命名,随后就可以在查询语句的其他地方引用这个名称。语句格式如下:
1 
WITH <alias_name> AS (subquery_sql_statement)
2  SELECT 
<column_name_list> FROM <alias>;
在一个With语句中可以定义多个子查询名称,子查询名称可以在查询语句中多处反复引用,甚至前面定义的子查询名称可以为后面定义的子查询引用。
1 
WITH <alias_one> AS
2   (select 
<column_name_list>  from tableA),
3     
 <alias_two> AS
4  
 (select  <column_name_list> 
from  alias_one)
5 SELECT <column_name_list>
6 FROM 
<alias_one>, <alias_two>
7 WHERE <join_condition>;
2. With语句的优点
(1) 
Oracle通过将With子查询结果存储在用户临时表空间中,达到一次执行多次引用的目的,从而提高了查询效率。
(2) 
With语句使SQL的可读性增强。
3. 
With语句使用举例
1、查询出部门的总薪水大于所有部门平均总薪水的部门。
部门表s_dept,员工表s_emp。
分析:做这个查询,首先必须计算出所有部门的总薪水,然后计算出总薪水的平均薪水,再筛选出部门的总薪水大于所有部门总薪水平均薪水的部门。那么第1 
步with 查询查出所有部门的总薪水,第2 步用with 从第1 步获得的结果表中查询出平均薪水,最后利用这两次的with 
查询比较总薪水大于平均薪水的结果,如下:
1 WITH DEPT_COSTS AS –查询出部门的总工资 
2  (SELECT D.DNAME, SUM(E.SAL) 
DEPT_TOTAL 
3     FROM DEPT D, EMP E 
4    
WHERE E.DEPTNO = D.DEPTNO 
5    GROUP BY D.DNAME), 
6 AVE_COST 
AS   –查询出部门的平均工资,在后一个WITH语句中可以引用前一个定义的WITH语句 
7  (SELECT 
SUM(DEPT_TOTAL) / COUNT(*) AVG_SUM FROM DEPT_COSTS) 
8 SELECT * 
9  
 FROM DEPT_COSTS DC10  WHERE DC.DEPT_TOTAL > (SELECT 
AC.AVG_SUM FROM AVE_COST AC)–进行比较
4. With使用注意事项
1. 注意语法格式
1) 
在同级select前有多个查询定义的时候,第1个用with,后面的不用with,并且用逗号隔开。
2) 最后一个with 
子句与下面的查询之间不能有逗号,只通过右括号分割,with 
子句的查询必须用括号括起来。
3)如果定义了with子句,而在查询中不使用,那么会报ora-32035 
错误。
4)一个with子句内部不能嵌套with子句。
2.With子查询中的列应该加别名以便引用。
5.With语句的复杂用法
1. 
一般我们只在顶层Select语句前定义With语句。
2. 
实际上,SQL语句中凡是可以使用Select子查询的位置,如标量子查询、from后的子查询、insert、update中的子查询都可以使用With语句。
