Oracle CTE表达式理解
为什么要用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表达式理解相关推荐
- oracle表 游标,Oracle游标表达式和表函数
Oracle游标表达式是Oracle数据库中的重要概念,下面就为您详细介绍Oracle游标表达式和表函数方面的知识,供您参考学习之用. Oracle游标表达式(有时称为游标子队列)是 SQL 语言的一 ...
- C# = Lambda表达式理解
C# => Lambda表达式理解 主要的代码借鉴:http://www.cnblogs.com/knowledgesea/p/3163725.html 希望能够帮助理解lambda表达式. 定 ...
- 1.oracle的dump理解一 BH buffer header
1.oracle的dump理解一 BH buffer header 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/5122844 ...
- oracle stalestats_深入理解oracle优化器统计数据(Optimizer Statistics)
理解oracle优化器统计数据 首先来介绍oracle数据库使用基于规则优化器(RBO)来决定如何执行一个sql语句.基于规则优化器顾名思义,它是遵循一组规则来判断一个sql语句的执行计划.这组规则是 ...
- oracle 存储过程(分析理解)
我的理解 比较简单(仅供参考) 存储过程就相当于java里面的方法 简单讲就是一串代码能够实现某个特定的功能,想要使用这个方法直接调用方法名就能够使用他的功能,这就是方法 oracle 存储过程也 ...
- oracle usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园
ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表 use_nl(t1,t2):表示对表t1.t2关联时采用嵌套循环连接,其并不能让优化器确定谁是驱动表或谁 ...
- Oracle里schema理解
在Oracle中,一个用户就是一个Schema,表都是建立在Schema中的,也可以理解为每个用户拥有不同的表.一个用户想访问另外一个用户,也就是另外一个schema的表的时候,可以用 usernam ...
- oracle中@,深入理解Oracle中的DBCA
但凡是学习 过Oracle的同学,DBCA都是一个必备工具,有了这个工具,创建数据库成为可能.而DBCA本身有图形和静默两种方式.静默方式看起来高大上,可以轻松搞定一个看似很复杂的创建数据库过程,而只 ...
- ORACLE 正值表达式
ORACLE终于在10G中提供了对正则表达式的支持,以前那些需要通过LIKE来进行的复杂的匹配就可以通过使用正则表达式更简单的实现. ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGE ...
最新文章
- Python Elasticsearch 插入数据
- [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)
- 计算机数日期,计算机如何计算两个日期之间的天数
- (王道408考研数据结构)第二章线性表-第三节5:顺序表和链表的比较
- rnn按时间展开_一文搞懂RNN(循环神经网络)基础篇
- Selenium UI自动化测试(五)WebDriver控制浏览器的操作
- 使用ByteArray及AMF来提高Data Object的操作效率
- ASP.NET MVC Model绑定(五)
- 【图像配准】基于matlab互信息图像配准【含Matlab源码 1210期】
- iOS开发之 WebView
- 程序员(应届生)求职简历模板+LaTex(overleaf)简历制作+博士简历模板分享+简历赏析
- 使用openfiler配置共享存储(1)——openfiler的安装和配置
- 面试前端的简历的注意事项
- 计算机还原桌面的文件会不会丢失,在用系统还原后会丢失文件吗?谢谢
- kafka源码愫读(5)、ReplicaManager模块源码分析
- 微信小程序可自定义单片机温湿度阈值(基于esp32c3+onenet+微信小程序)
- Unity ASE制作彩色流光马赛克 像素风 舞池DJ台效果Shader
- 2. C++ Visual Studio中同一个项目包含多个有main函数的源文件怎么分别运行?
- Echarts中国地图的china.js下载
- mysql集群方案PXC_【Mysql】MySQL集群方案之PXC(percona xtradb cluster)
热门文章
- 随机森林分析金融数据
- 校园安全手环助力校园无感知考勤、精细化的管理
- 二、MAC层和MAC地址
- Netty百万级推送服务设计要点
- 小时用计算机怎么算,一天24小时在计算机上消耗多少千瓦小时,以及一天中计算机的用电量计算...
- php 生成图片并压缩保存到本地或者输出到网页imagejpeg方法
- myBaits Expert Wheat Exome — 从多个小麦品种中富集超过250Mb的高可信度的外显子
- 第三章 多维随机变量及其分布 3.2 边缘分布
- 样本方差是总体方差的无偏估计
- 大数据预测报告:2018年春节长假居民最喜欢去这些地方