时间:2021-07-01 10:21:17 帮助过:31人阅读
使用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 停止