WITH AS短语,也叫做子查询部分(subquery factoring),可以做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。
特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。
一、with as 语法
单个语法:
with tempName as (select ....)
select ...
多个语法:
with tempName1 as (select ....),
tempName2 as (select ....),
tempName3 as (select ....) ...
select ... 
With查询语句不是以select开始的,而是以“WITH”关键字开头
可认为在真正进行查询之前预先构造了一个临时表TT,之后便可多次使用它做进一步的分析和处理
二、WITH AS实例
例:现在要从1-19中得到11-14。一般的sql如下:
select * from
(
            --模拟生一个20行的数据
             SELECT LEVEL AS lv
               FROM DUAL
         CONNECT BY LEVEL < 20
) tt
 WHERE tt.lv > 10 AND tt.lv < 15
 
使用With as 的SQL为:
with TT as( --模拟生一个20行的数据 SELECT LEVEL AS lv FROM DUAL CONNECT BY LEVEL < 20 ) select lv from TTWHERE lv > 10 AND lv < 15
多个临时表实例:
WITH
T3 AS
(
SELECT T1.ID, T1.CODE1, T2.DESCRIPTION
FROM TB_DATA T1, TB_CODE T2
WHERE T1.CODE1 = T2.CODE
),
T4 AS
(
SELECT T1.ID, T1.CODE2, T2.DESCRIPTION
FROM TB_DATA T1, TB_CODE T2
WHERE T1.CODE2 = T2.CODE
)
SELECT T3.ID, T3.DESCRIPTION, T4.DESCRIPTION
FROM T3, T4
WHERE T3.ID = T4.ID
ORDER BY ID;  
三、WITH Clause方法的优点
     增加了SQL的易读性,如果构造了多个子查询,结构会更清晰;更重要的是:“一次分析,多次使用”,这也是为什么会提供性能的地方,达到了“少读”的目标。
     第一种使用子查询的方法表被扫描了两次,而使用WITH Clause方法,表仅被扫描一次。这样可以大大的提高数据分析和查询的效率。
     另外,观察WITH Clause方法执行计划,其中“SYS_TEMP_XXXX”便是在运行过程中构造的中间统计结果临时表。
四、WITH AS 与增删改查结合用法
注意:1.with必须紧跟引用的select语句
2.with创建的临时表必须被引用,否则报错
4.1与select查询语句结合使用
查询同一个单据编号对应的借款单和核销单中,借款金额不相等的单据
with verificationInfo as(select ment.fnumber,sum(t.famount) vLoanSum,ment.fnumber "单据编号",sum(t.famount) "核销单中借款总额"from shenzhenjm.t_finance_expenseremburseitem tleft join shenzhenjm.t_finance_expenserembursement menton ment.fid = t.fkrembursementidwhere 1 = 1group by ment.fnumber),loanInfo as(select ment.fnumber,sum(t.famount) loanSum,ment.fnumber "单据编号",sum(t.famount) "借款单中借款总额"from shenzhenjm.t_finance_expenseremburseitem2 tleft join shenzhenjm.t_finance_expenserembursement menton ment.fid = t.fkrembursementidwhere 1 = 1group by ment.fnumber)select *from verificationInfo v, loanInfo lwhere l.fnumber = v.fnumberand l.loanSum != v.vLoanSum;
4.2与insert结合使用
如下的with as语句,不能放在insert前,而是放在紧接着要调用的地方前
要求将同一个单据编号对应的借款单和核销单中,借款金额不相等的单据,对应的借款单删除,并将对应的核销单插入到借款单表中 (借款单和核销单表结构完全一样)
insert into T_finance_ExpenseRemburseItem2(FID,FKREMBURSEMENTID,FAMOUNT,FKCREATEBYID,FCREATETIME,FKCUID,FKCOSTTYPEID,FCOSTTYPENAME)with verificationInfo as(select ment.fnumber,sum(t.famount) vLoanSum,ment.fnumber "单据编号",sum(t.famount) "核销单中借款总额"from shenzhenjm.t_finance_expenseremburseitem tleft join shenzhenjm.t_finance_expenserembursement menton ment.fid = t.fkrembursementidwhere 1 = 1group by ment.fnumber),loanInfo as(select ment.fnumber,sum(t.famount) loanSum,ment.fnumber "单据编号",sum(t.famount) "借款单中借款总额"from shenzhenjm.t_finance_expenseremburseitem2 tleft join shenzhenjm.t_finance_expenserembursement menton ment.fid = t.fkrembursementidwhere 1 = 1group by ment.fnumber)select sys_guid(),ment.fid,t.famount,ment.fkcreatebyid,ment.fcreatetime,ment.fkcuid,t.fkcosttypeid,t.fcosttypenamefrom T_finance_ExpenseRemburseItem tleft join t_finance_expenserembursement menton ment.fid = t.fkrembursementidwhere 1 = 1and exists (select *from verificationInfo v, loanInfo lwhere l.fnumber = v.fnumberand l.loanSum != v.vLoanSumand v.fnumber = ment.fnumber);
4.3 与delete删除结合使用
delete from t_finance_expenseremburseitem2 item2where exists(with temp as (select t.fnumber,sum(item1.famount) vloanSum,sum(item1.frealityamount) vSum,sum(item2.famount) loanSumfrom t_finance_expenserembursement tleft join t_finance_expenseremburseitem item1on item1.fkrembursementid = t.fidleft join t_finance_expenseremburseitem2 item2on item2.fkrembursementid = t.fidwhere 1 = 1and t.frembursementtype = 'LOAN_REPORT'and to_char(t.fcreatetime, 'yyyy') > '2017'group by t.fnumberorder by t.fnumber asc)select 1from temp tleft join t_finance_expenserembursement menton t.fnumber = ment.fnumberleft join t_finance_expenseremburseitem2 itemon item.fkrembursementid = ment.fidwhere t.vloanSum != t.loanSumand item.fid = item2.fid);
4.4与update结合使用
update dest bset b.NAME =(with t as (select * from temp)select a.NAME from temp a where a.ID = b.ID)

深入理解和使用Oracle中with as语句以及与增删改查的结合使用相关推荐

  1. Oracle OAF 学习小结(2)- 增删改查/LOV/Button/Sequence 的完整案例开发

    开发配置 了解EBS服务器目录 $JAVA_TOP JSP中可以引用标准Java类库,也可以引用其他Java类库,客户化开发的类库统一放在$JAVA_TOP下,按目录组织.OAF开发的文件都放在这里. ...

  2. Oracle的登陆问题和初级学习增删改查(省略安装和卸载)

    1:学习Oracle首先需要安装Oracle,网上已经有很多很多教程了,这里不做叙述,自己百度即可,这里安装的标准版,个人根据需求安装学习或者企业开发即可.如果安装出错,自己百度Oracle的卸载即可 ...

  3. 华山论剑之iOS中(数组,字典,SQLite,CoreData)的“增删改查“

    我们的生活态度就应该是 "不抱怨" ! 其实我想写这篇文章很久了,因为自己做的iOS开发 ,对数据这一块有这极高的要求.所以一些必须的存储数据的使用,我们都有必要熟悉用法.在以前我 ...

  4. Android中数据库的一些操作(增删改查)

    提起Android的开发,就不得不提数据库,几乎每个App中都会用到Sqlit数据库存储一些数据,小编闲暇时期,写了一个小demo关于数据库的增删改查,之前也介绍过数据库的一个开源框架ORMLite, ...

  5. Mybatis中使用Dao实现类实现增删改查【实际开发中使用代理dao】

    在Mybatis开发中,使用到的是代理Dao的方式实现增删改查,这样就不需要在写Dao的实现类 但是Mybatis也支持写Dao实现类!即DaoImpl 直接上DaoImpl,之前的代码可以参考前面几 ...

  6. mongodb windows的安装方法和添加到任务管理器中、检测是否成功、增删改查命令...

    转: mongodb安装方法: https://blog.csdn.net/heshushun/article/details/77776706        mongodb检测安装成功 .以及增删改 ...

  7. android中对sim卡联系人的增删改查以及监听sim卡联系数据的改变

    sim卡联系人的增删改查主要是通过ContentProvider来进行操作的,在android中对sim卡联系人操作的provider是定义在IccProvider.java这个类中的,这个类位于an ...

  8. java中select的用法_mybaties中select用法,以及常用增删改查

    查询语句是使用 MyBatis 时最常用的元素之一 select元素配置细节如下 属性 描述 取值 默认 id 在这个模式下唯一的标识符,可被其它语句引用 parameterType 传给此语句的参数 ...

  9. Spring boot 中使用BBoss-ES进行ES的增删改查

    最近项目中有文件信息需要快速索引,就打算把原来存储到MYSQL里面的数据全部存储到ES中 一下是代码 yml配置 ```yaml elasticsearch:bboss:elasticUser:ela ...

最新文章

  1. 1.Power Designer 由数据库反向生成pdm文件
  2. 项目中使用completablefuture_“工业冷冻用中大型冷盐水机组使用R290替代R22项目”通过验收...
  3. UA MATH566 统计理论 截断数据
  4. completablefuture 线程池_SpringBoot中如何优雅的使用多线程
  5. 最全三大框架整合(使用映射)——Dept.hbm.xml
  6. Nhibernate代码自动生成工具[转]
  7. 利用连接对象增删改数据 jdbc 20210409235645323
  8. 微信小程序开发学习笔记005--微信小程序组件详解
  9. 为什么是 OnDraw(CDC* /*pDC*/) 而不是 OnDraw(CDC* pDC)
  10. 归并排序时间复杂度_一文带你读懂排序算法(四):归并算法
  11. MAC修改.bashrc/.bash_profile无效,默认的用户配置文件是.zshrc,
  12. 【学习笔记】尚硅谷-AJAX
  13. 服务器信号满格网速很慢,手机信号满格但网速很慢 可能是这5个原因
  14. 即将到来的交通革命——出行即服务(MaaS)
  15. MT8173芯片资料,MT8173处理器参数介绍
  16. Android微信支付彻底扫坑
  17. Qt经典蓝牙系列四(经典蓝牙客户端的设计 纯Qt代码) android/windows10
  18. java.net.SocketException: Too many open files解决方法
  19. 计算机电池维修方案,解决方案:计算机主板电池已耗尽,如果不更换电池该怎么办?如何更换电池...
  20. 后台系统登录一般流程

热门文章

  1. stm8s开发(七) SPI的使用:SPI主机通信!
  2. Linux Device和Driver注册过程,以及Probe的时机
  3. mysql error.log 权限_docker-compose 启动mysql 容器时 error.log 无权限访问怎么办?
  4. cmake (2)其他指令
  5. 以太坊知识教程------智能合约(2)调用 delegatecall call send
  6. 2019第十届蓝桥杯比赛总结(B组c/c++)
  7. 数学建模——灰色预测模型Python代码
  8. 【Flask】ORM的关联关系
  9. Shell编程之for循环
  10. python网络编程—TCP协议(一)