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语句。
原文地址:http://www.cnblogs.com/zhugehome/p/3758467.html