zoukankan      html  css  js  c++  java
  • 数据库cte的理解和使用

    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条件不成立,无法生成新行,则递归停止

    oracle使用递归链接:https://blog.csdn.net/lilizhou2008/article/details/108505353

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

    只要你不觉得尴尬,那尴尬的就是别人
  • 相关阅读:
    centos同步北京时间
    django-migrate一败再败
    Mac-无法进入mysql,你这样做就对了
    celery beat
    devops--django+ldap
    本地终端连接到远程服务器
    Mac--ModuleNotFoundError: No module named 'magic'
    一站式解决Mac--socket.gaierror: [Errno 8] nodename nor servname provided, or not known
    docker--常用指令
    Mac--管理mysql、redis服务的常用命令
  • 原文地址:https://www.cnblogs.com/wujiaxing/p/14537647.html
Copyright © 2011-2022 走看看