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: 在要求输入数字处找到非数字字符

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hikktn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值