首页 > 代码库 > oracle的with语法

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语句。