设为首页 收藏本站
查看: 750|回复: 0

[经验分享] Oracle 中的with * as

[复制链接]

尚未签到

发表于 2018-9-12 13:31:17 | 显示全部楼层 |阅读模式
  With语句的语法(AS后面的括号是不可以空缺的)
  1WITHAS (subquery_sql_statement)
  2SELECTFROM;
  简单的with语句:
  WITH A AS
  (SELECT*FROM DUAL)
  SELECT*FROM A
  注意,定义了WITH语句必须在后边的查询中使用,否则提示错误信息:
  1WITH A AS
  2  (SELECT*FROM DUAL)
  3SELECT*FROM dual
  (错误的原因是因为没有使用定义的WITH语句进行查询)
  两个with语句的语法:
  1WITHAS
  2  (subquery_sql_statement),
  3AS
  4  (sql_statement_from_alias_one)
  5SELECT
  6FROM,
  7WHERE;
  测试例子:
  1WITH A AS
  2  (SELECT*FROM DUAL),
  3 B AS
  4  (SELECT*FROM DUAL)
  5SELECT*FROM B, A
  当在FROM关键子后面没有全部使用定义的WITH语句,他就会提示同上的错误信息:
  (不可引用在with子句中定于的查询)
  在视图中使用WITH语句进行连接:
  1CREATEORREPLACEVIEW WITH_V AS
  2WITH DEPT_V AS (SELECT*FROM DEPT),
  3   EMP_V AS (SELECT*FROM EMP)
  4SELECT D.DNAME,D.LOC,E.*FROM EMP_V E
  5LEFTJOIN DEPT_V D
  6ON D.DEPTNO = E.DEPTNO
  使用WITH AS 语句可以为一个子查询语句块定义一个名称,使用这个子查询名称可以在查询语句的很多地方引用这个子查询。Oracle 数据库像对待内联视图或临时表一样对待被引用的子查询名称,从而起到一定的优化作用。with子句是9i新增语法。你可以在任何一个顶层的SELECT 语句以及几乎所有类型的子查询语句前,使用子查询定义子句。被定义的子查询名称可以在主查询语句以及所有的子查询语句中引用,但未定义前不能引用。with子句中不能嵌套定义,但子查询中出现的“子查询定义”语句可以引用已定义的子查询名称。
  WITH子句相关总结:
  1、在同级select前有多个查询定义的时候,第1个用with,后面的不用with,并且用逗号隔开。
  2、最后一个with 子句与下面的查询之间不能有逗号,只通过右括号分割,with 子句的查询必须用括号括起来
  3、如果定义了with子句,而在查询中不使用,那么会报ora-32035 错误:未引用在with子句中定义的查询名。(至少一个with查询的name未被引用,解决方法是移除未被引用的with查询),注意:只要后面有引用的就可以,不一定非要在主查询中引用,比如后面的with查询也引用了,也是可以的。
  4、前面的with子句定义的查询在后面的with子句中可以使用。但是一个with子句内部不能嵌套with子句。
  5、with查询的结果列有别名,引用的时候必须使用别名或*。
  WITH语句的优点:
  (1). SQL可读性增强。比如对于特定with子查询取个有意义的名字等。
  (2)、with子查询只执行一次,将结果存储在用户临时表空间中,可以引用多次,增强性能。
  举例:在进行导入EXCEL的过程中,有时候,需要将数据存储在临时表中,当下一次在进行导入的时候,进行清除临时表的数据,但是这时候,有时候发生并发问题的话,两个用户可能会分别操作对方的数据,所以,可能造成混乱,但是可以使用WITH函数和UNION语句拼接一个SQL语句,存储在SESSION中,当需要导出错误信息的时候,可以使用该语句构造数据。
  ---------------------------WITH语句的使用例子:
  1、查询出部门的总薪水大于所有部门平均总薪水的部门。部门表s_dept,员工表s_emp。分析:做这个查询,首先必须计算出所有部门的总薪水,然后计算出总薪水的平均薪水,再筛选出部门的总薪水大于所有部门总薪水平均薪水的部门。那么第1 步with 查询查出所有部门的总薪水,第2 步用with 从第1 步获得的结果表中查询出平均薪水,最后利用这两次的with 查询比较总薪水大于平均薪水的结果,如下:
  1WITH DEPT_COSTS AS--查询出部门的总工资
  2  (SELECT D.DNAME, SUM(E.SAL) DEPT_TOTAL
  3FROMDEPT D, EMP E
  4WHERE E.DEPTNO =D.DEPTNO
  5GROUPBYD.DNAME),
  6 AVE_COST AS--查询出部门的平均工资,在后一个WITH语句中可以引用前一个定义的WITH语句
  7  (SELECTSUM(DEPT_TOTAL) /COUNT(*) AVG_SUM FROMDEPT_COSTS)
  8SELECT * from  AVE_COST


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-573406-1-1.html 上篇帖子: Oracle创建数据库(手动) 下篇帖子: oracle 删除用户与表空间 SQL
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表