为什么要用CTE表达式?

避免使用子查询,CTE 将使查询更容易阅读和理解。
使用 CTE 时,用新行填充查询。
相信大家一定写过上百行关联查询,甚至出现连接七八张表的情况,可能你写的SQL你能理解,但是后人维护就困难了。
所以,要把一些子查询抽离出去,SQL的可读性增加,方便调试,当你不知道这条SQL的意思,或者要弄懂它,首先执行一遍子查询,结合子查询在来看整条SQL,难度就下降了不少。

CTE是什么?

公用表达式,就是将一些子查询SQL分离成一条公用的SQL,复用性提高。
写法也比较简单:

with 表达式名(字段A) as (select 字段A from dual
)
select * from 表达式名

举个例子:
之前的SQL:

select id,name
from (select id,name,age from user where id = '1') as user
left join person on user.id = person.id
where person.name = '张三'

改造后的SQL:

with user as (select id,name,age from user where id = '1'
)
select id,name
from user
left join person on user.id = person.id
where person.name = '张三'

而出现多条子查询,如下:

with user as (select id,name,age from user where id = '1'
),
user2 as (select id,name from user where id = '2'
)
select * from user2

局域性

假设,我们要写 select * from dual where id =(select iid from dual)。
这时,如果你使用CTE表达式,它会直接报错

ORA-00904: “XZQ”: 标识符无效

还有一个点,该CTE表达式不适合子查询,比如 select iid,(select user from person where person.iid = student.iid) from student
这句SQL如果用CTE表达式,那么将会异常复杂,并且稍微没理解好,就改造不出CTE表达式,失去了可读性。

CTE公用表达式,只适合做内外连接时,所写的子查询,不适合条件子查询,参数子查询。

结论

CTE写法能够帮助我们的SQL提高可读性、复用性,但是公用表达式的别名一定要取的有意义,否则CTE表达式就没有多大意义了

2022年9月3日更新=====
cte表达式,里面有大坑!!!
当同时有多个cte时,其中你加入了时间维度,cte这时候就开始装怪了。
原本其他返回的格式,全部由之前的类型转换为number。
你会看到以下这些错误:

[2022-09-03 16:27:54] [42000][932] ORA-00932: 数据类型不一致: 应为 DATE, 但却获得 NUMBER

[2022-09-03 17:18:08] [22008][1858] ORA-01858: 在要求输入数字处找到非数字字符

全是坑!!!
没办法,根本用不了。干!又浪费了我一个下午的时间!!

Oracle CTE表达式理解相关推荐

  1. oracle表 游标,Oracle游标表达式和表函数

    Oracle游标表达式是Oracle数据库中的重要概念,下面就为您详细介绍Oracle游标表达式和表函数方面的知识,供您参考学习之用. Oracle游标表达式(有时称为游标子队列)是 SQL 语言的一 ...

  2. C# = Lambda表达式理解

    C# => Lambda表达式理解 主要的代码借鉴:http://www.cnblogs.com/knowledgesea/p/3163725.html 希望能够帮助理解lambda表达式. 定 ...

  3. 1.oracle的dump理解一 BH buffer header

    1.oracle的dump理解一 BH buffer header 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/5122844 ...

  4. oracle stalestats_深入理解oracle优化器统计数据(Optimizer Statistics)

    理解oracle优化器统计数据 首先来介绍oracle数据库使用基于规则优化器(RBO)来决定如何执行一个sql语句.基于规则优化器顾名思义,它是遵循一组规则来判断一个sql语句的执行计划.这组规则是 ...

  5. oracle 存储过程(分析理解)

    我的理解 比较简单(仅供参考)   存储过程就相当于java里面的方法 简单讲就是一串代码能够实现某个特定的功能,想要使用这个方法直接调用方法名就能够使用他的功能,这就是方法 oracle 存储过程也 ...

  6. oracle usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园

    ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表 use_nl(t1,t2):表示对表t1.t2关联时采用嵌套循环连接,其并不能让优化器确定谁是驱动表或谁 ...

  7. Oracle里schema理解

    在Oracle中,一个用户就是一个Schema,表都是建立在Schema中的,也可以理解为每个用户拥有不同的表.一个用户想访问另外一个用户,也就是另外一个schema的表的时候,可以用 usernam ...

  8. oracle中@,深入理解Oracle中的DBCA

    但凡是学习 过Oracle的同学,DBCA都是一个必备工具,有了这个工具,创建数据库成为可能.而DBCA本身有图形和静默两种方式.静默方式看起来高大上,可以轻松搞定一个看似很复杂的创建数据库过程,而只 ...

  9. ORACLE 正值表达式

    ORACLE终于在10G中提供了对正则表达式的支持,以前那些需要通过LIKE来进行的复杂的匹配就可以通过使用正则表达式更简单的实现. ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGE ...

最新文章

  1. Python Elasticsearch 插入数据
  2. [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)
  3. 计算机数日期,计算机如何计算两个日期之间的天数
  4. (王道408考研数据结构)第二章线性表-第三节5:顺序表和链表的比较
  5. rnn按时间展开_一文搞懂RNN(循环神经网络)基础篇
  6. Selenium UI自动化测试(五)WebDriver控制浏览器的操作
  7. 使用ByteArray及AMF来提高Data Object的操作效率
  8. ASP.NET MVC Model绑定(五)
  9. 【图像配准】基于matlab互信息图像配准【含Matlab源码 1210期】
  10. iOS开发之 WebView
  11. 程序员(应届生)求职简历模板+LaTex(overleaf)简历制作+博士简历模板分享+简历赏析
  12. 使用openfiler配置共享存储(1)——openfiler的安装和配置
  13. 面试前端的简历的注意事项
  14. 计算机还原桌面的文件会不会丢失,在用系统还原后会丢失文件吗?谢谢
  15. kafka源码愫读(5)、ReplicaManager模块源码分析
  16. 微信小程序可自定义单片机温湿度阈值(基于esp32c3+onenet+微信小程序)
  17. Unity ASE制作彩色流光马赛克 像素风 舞池DJ台效果Shader
  18. 2. C++ Visual Studio中同一个项目包含多个有main函数的源文件怎么分别运行?
  19. Echarts中国地图的china.js下载
  20. mysql集群方案PXC_【Mysql】MySQL集群方案之PXC(percona xtradb cluster)

热门文章

  1. 随机森林分析金融数据
  2. 校园安全手环助力校园无感知考勤、精细化的管理
  3. 二、MAC层和MAC地址
  4. Netty百万级推送服务设计要点
  5. 小时用计算机怎么算,一天24小时在计算机上消耗多少千瓦小时,以及一天中计算机的用电量计算...
  6. php 生成图片并压缩保存到本地或者输出到网页imagejpeg方法
  7. myBaits Expert Wheat Exome — 从多个小麦品种中富集超过250Mb的高可信度的外显子
  8. 第三章 多维随机变量及其分布 3.2 边缘分布
  9. 样本方差是总体方差的无偏估计
  10. 大数据预测报告:2018年春节长假居民最喜欢去这些地方