With tempTabel as (select...)临时表的用法详解

最近优化sql,发现这个临时表真是个好东西。分享出来

(1)with基础

使用WITH AS 语句可以为一个子查询语句块定义一个名称,使用这个子查询名称可以在查询语句的很多地方引用这个子查询。Oracle 数据库像对待内联视图或临时表一样对待被引用的子查询名称,从而起到一定的优化作用。with子句是9i新增语法。

你可以在任何一个顶层的SELECT 语句以及几乎所有类型的子查询语句前,使用子查询定义子句。被定义的子查询名称可以在主查询语句以及所有的子查询语句中引用,但未定义前不能引用。

with子句中不能嵌套定义<也就是with子句中不能有with子句>,但子查询中出现的子查询定义语句可以引用已定义的子查询名称。<可以引用前面已经定义的with子句>

(2)with子句相关总结

1.使用with子句可以让子查询重用相同的with查询块,通过select调用(with子句只能被select查询块引用),一般在with查询用到多次情况下。在引用的select语句之前定义,同级只能定义with关键字只能使用一次,多个用逗号分割。

2.with子句的返回结果存到用户的临时表空间中,只做一次查询,反复使用,提高效率。

3.在同级select前有多个查询定义的时候,第1个用with,后面的不用with,并且用逗号隔开。

5.最后一个with 子句与下面的查询之间不能有逗号,只通过右括号分割,with 子句的查询必须用括号括起来

6.如果定义了with子句,而在查询中不使用,那么会报ora-32035 错误:未引用在with子句中定义的查询名。(至少一个with查询的name未被引用,解决方法是移除未被引用的with查询),注意:只要后面有引用 的就可以,不一定非要在主查询中引用,比如后面的with查询也引用了,也是可以的。

7.前面的with子句定义的查询在后面的with子句中可以使用。但是一个with子句内部不能嵌套with子句。

8.当一个查询块名字和一个表名或其他的对象相同时,解析器从内向外搜索,优先使用子查询块名字。

9.with查询的结果列有别名,引用的时候必须使用别名或*。

(3)with子句优点:

 1. SQL可读性增强。比如对于特定with子查询取个有意义的名字等。

 2. with子查询只执行一次,将结果存储在用户临时表空间中,可以引用多次,增强性能。
with子句语法:
With alias_name as (select1), –as和select中的括号都不能省略
alias_name2 as (select2),–后面的没有with,逗号分割,同一个主查询同级别地方,with子查询只能定义一次
 …
alias_namen as (select n) –与下面的实际查询之间没有逗号
Select ….

具体的例子可以参看源大牛博文:
With temp as—sql语句用法

猜你喜欢

转载自blog.csdn.net/zhanglf02/article/details/79807863
今日推荐