为什么要用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: 在要求输入数字处找到非数字字符
全是坑!!!
没办法,根本用不了。干!又浪费了我一个下午的时间!!