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

 (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 *

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

oracle的with语法,布布扣,bubuko.com

时间: 2024-10-27 18:30:35

oracle的with语法的相关文章

Oracle Update 语句语法与性能分析 - 多表关联

Oracle Update 语句语法与性能分析 - 多表关联 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create table customers ( customer_id number(8) not null, -- 客户标示 city_name varchar2(10) not null, -- 所在城市 customer_type char(2) not null, -- 客户类型 ... ) create

oracle的存储过程语法(转)

1.ORA-00942: table or view does not exist 指的你要操作的表尚未存在,需要先create出来先. 2.ORA-00922: missing or invalid option 指的是有语法错误.遗漏了分号什么的 3.Warning: Procedure created with compilation errors 比如  create or replace procedure p_test_pro1 is     begin       insert i

Oracle存储过程基本语法介绍

Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体. 行3: BEGIN关键词表明PL/SQL体的开始. 行4: NULL PL/SQL语句表明什么事都不做,这句不能删

Oracle存储过程function语法及案例

create or replace function F01_SX03_SUM(statdate varchar2, code varchar2, para varchar2) RETURN number IS v_me number; v_mb number; begin if para = 'me' then select nvl(sum(nvl(me, 0)), 0) / 10000 into v_me from sx03_gl_accass t where t.ccode like (c

Oracle存储过程Procedure语法及案例

create or replace procedure replace(desstr in varchar2, replacestr in varchar2, tablename in varchar2, strgranularity in varchar2, strorgankey in varchar2, strstatisticdate in date) is begin update t41_systemcal_upday t1 set t1.calchar = replace(t1.c

Oracle存储过程基本语法 存储过程

Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体. 行3: BEGIN关键词表明PL/SQL体的开始. 行4: NULL PL/SQL语句表明什么事都不做,这句不能删

Oracle MERGE INTO语法探究

1.MERGE INTO 的用途:   MERGE INTO 是Oracle 9i新增的语法,在10g时得到补充,用来合并UPDATE和INSERT语句,根据一张表或子查询与另一张表进行连接查询,连接条件匹配就进行 UPDATE,不匹配就进行INSERT,这个语法仅需要一次全表扫描就可以完成全部工作,执行效率会比单纯的UPDATE+INSERT高,具体应用可用于表之间的同步.2.MERGE INTO 的语法:语法结构:MERGE [INTO [schema .] table [t_alias]

Oracle的基本语法,存储函数及触发器

1.PL/SQL    PL/SQL是Oracle对 ql语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句,使SQL语言具有过程处理能力.把 SQL 语言的数据操纵能  力与过程语言的数据处理能力结合起来,使得 PLSQL 面向过程但比过程语言简单.高效.灵活和实用.   基本语法结构:        [declare]   -- 声明变量        begin       -- 代码逻辑        [exception] -- 异常处理        end;    注意:

oracle存储过程创建语法及常见异常

oracle存储过程创建语法及常见异常: oracle存储过程语法: CREATE[ORReplace]PROCEDURE[schema.]procedure_name [(argument[{IN|OUT|INOUT}]datatype, ... argument[{IN|OUT|INOUT}]datatype)] {IS|AS} [descriptionpart说明部分] BEGIN SQLSTATEMENT语句序列 [EXCEPTION例外处理] END[procedureName过程名]