码迷,mamicode.com
首页 > 数据库 > 详细

数据库cte的理解和使用

时间:2021-03-16 14:10:00      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:pre   语句   连接   理解   load   复用   tin   article   停止   

cte可以使用在递归和非递归方式,在非递归方式时,优点可以提高性能,确定可能会有点难理解

1、非递归

有这么一张表,要查询当前菜单的信息以及父菜单的名称,也就是说要把pid换成pname

技术图片

 

 

 

传统方式,使用子查询或自连接查询

select m.*, (select name from menu where id = m.pid) as pname from menu as m; // 子查询
select t1.*, t2.name as pname from menu t1 inner join menu t2 on t1.pid = t2.id // 自连接

使用cte方式

with cte as (
 select * from menu
) 
select m.*, (select cte.name from cte where cte.id = m.pid) as pname from menu as m;

 

为什么会效率高呢? 因为 select * from menu 就执行了一次,后面就是复用,相当于就放入了缓存中



2、递归方式

递归cte是一种特殊的cte,其子查询会引用自身,with子句必须以 with recursive 开头。

cte递归子查询包括两部分:seed 查询 和 recursive 查询,中间由union [all] 或 union distinct 分隔。

seed 查询会被执行一次,以创建初始数据子集。

recursive 查询会被重复执行以返回数据子集,直到获得完整结果集。当迭代不会生成任何新行时,递归会停止

with recursive cte(n) as (
 select 1
 union all
 select n + 1 from cte where n < 10
)
select * from cte;

上面的语句,会递归显示10行,每行分别显示1-10数字。

 递归的过程如下:

1、首先执行 select 1 得到结果 1, 则当前 n 的值为 1。

2、接着执行 select n + 1 from cte where n < 10,因为当前 n 为 1,所以where条件成立,生成新行,select n + 1 得到结果 2,则当前 n 的值为 2。

3、继续执行 select n + 1 from cte where n < 10,因为当前 n 为 2,所以where条件成立,生成新行,select n + 1 得到结果 3,则当前 n 的值为 3。

4、一直递归下去

5、直到当 n 为 10 时,where条件不成立,无法生成新行,则递归停止

 

原文链接:https://www.jb51.net/article/180792.htm

 

数据库cte的理解和使用

标签:pre   语句   连接   理解   load   复用   tin   article   停止   

原文地址:https://www.cnblogs.com/wujiaxing/p/14537647.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!