背景

从上下级关系表中,任意一个节点数据出发,可以获得该节点的上级或下级。CTE的递归语法,或者 connect by 与 start with的 查询语法,能够实现这个需求。

当我们需要制作上下级关系的数据时,也可以使用CTE的递归语法。

举例

一个父节点拥有随机数量的子节点,通过控制层级数和随机数的上限,可以实现海量的数据集合。

  1. drop table t_level1;
  2. create table t_level1
  3. (
  4. id int primary key,
  5. pid int
  6. );
  7. create index t_level1_pid on t_level1 (pid);
  8. --Sequence For Primary key
  9. create sequence seq_level1;
  10. select count(*) from t_level1;
  11. truncate t_level1;
  12. --方法一:使用表作为record type,生成record数组
  13. with recursive rec as (
  14. --Root Node
  15. select array_agg((id, pid)::t_level3) as recs,
  16. 5 as max_lvl, --最大level
  17. 5 as rec_cnt --最大子节点数
  18. from (select nextval('seq_level1') as id, null as pid) t
  19. union all
  20. --Children Node, Random Number
  21. select array_agg((id, pid)::t_level3) as recs,
  22. recp.max_lvl as max_lvl,
  23. rec_cnt as rec_cnt
  24. from (select (unnest(rec.recs)).id as pid,
  25. rec.max_lvl - 1 as max_lvl,
  26. rec_cnt as rec_cnt
  27. from rec
  28. where rec.max_lvl > 1) as recp
  29. , lateral (select nextval('seq_level1') as id
  30. from generate_series(1, (random() * rec_cnt)::int)
  31. where pid > 0) t2
  32. group by pid, max_lvl, rec_cnt
  33. )
  34. select (unnest(recs)).*
  35. from rec;
  36. --方法二:使用主键作为type,生成主键类型数组
  37. with recursive rec as (
  38. --Root Node
  39. select array_agg(nextval('seq_level1')) as ids,
  40. null::bigint as pid,
  41. 5 as max_lvl, --最大level
  42. 5 as rec_cnt --最大子节点数
  43. union all
  44. --Children Node, Random Number
  45. select (select array_agg(nextval('seq_level1')) as ids
  46. from generate_series(1, (random() * rec_cnt)::int)
  47. ) as ids,
  48. pid as pid,
  49. max_lvl as max_lvl,
  50. rec_cnt as rec_cnt
  51. from (select unnest(rec.ids) as pid,
  52. rec.max_lvl - 1 as max_lvl,
  53. rec_cnt as rec_cnt
  54. from rec
  55. where rec.max_lvl > 1) as recp
  56. )
  57. select unnest(ids) as id, pid, max_lvl
  58. from rec;

KingbaseES的SQL语句-CTE递归的更多相关文章

  1. SQL笔记 - CTE递归实例:显示部门全称

    昨天在整理JS的Function时,示例是一个递归函数.说起递归,想起前段时间在搞CTE,那个纠结呀,看似容易,可我总抓不住门道,什么递归条件,什么结束条件,一头雾水...今天一大早就爬起来,果然不负 ...

  2. Sql Server CTE递归

    WITH cte AS ( SELECT a.FNUMBER,a.FMATERIALID AS MainId,b.FMATERIALID AS ChileID,CAST(b.FMATERIALID A ...

  3. sql server CTE递归使用测试

    --CTE递归查询 if(object_id(N'menu') > 0) drop table menu CREATE TABLE MENU ( name nvarchar(50) NOT NU ...

  4. SQL笔记 - CTE递归实例(续):显示指定部门的全称

    前一篇文章中已经可以取得所有部门的全称,但现在又有个新的需求: 只想得到某一个部门的部门全称,虽然可以用where条件来过滤,但是会有点小浪费. 这时我们可以从后往前找,先看下效果: 最后一条就是,行 ...

  5. SQL With(递归 CTE 查询)

    本文来自:http://www.cnblogs.com/smailxiaobai/archive/2012/01/16/2323291.html 指定临时命名的结果集,这些结果集称为公用表表达式 (C ...

  6. SQL 递归查询,意淫CTE递归的执行步骤

    今天用到了sql的递归查询.递归查询是CTE语句with xx as(....)实现的. 假如表Category数据如下. 我们想查找机枪这个子分类极其层次关系(通过子节点,查询所有层级节点).以下是 ...

  7. SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用

    本文出处:http://www.cnblogs.com/wy123/p/5960825.html 我们在做开发的时候,有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连续的季度日期等等 ...

  8. 求SQL语句递归的算法

    表结构是这样的 部门    上级部门    A           BB           CC           DA           AB           BC           C ...

  9. TSql CTE 递归原理探究

    CTE是如何进行递归的?产生递归的条件有三个,分别是 初始值 自身调用自身 结束递归的条件 1,示例代码 ;with cte as ( as jd union all as jd from cte ) ...

随机推荐

  1. SAP Web Dynpro-消息

    在ABAP Workbench中,您还可以创建和显示包含Dynpro应用程序最终用户信息的消息. 这些消息显示在屏幕上. 这些是用户交互消息,显示有关Web Dynpro应用程序的重要信息. 为了向用 ...

  2. kubernetes集群简单实例搭建

    systemctl stop firewalld && systemctl disable firewalldvim /etc/selinux/configSELINUX=disabl ...

  3. 基于Vue2.x的前端架构,我们是这么做的

    通过Vue CLI可以方便的创建一个Vue项目,但是对于实际项目来说还是不够的,所以一般都会根据业务的情况来在其基础上添加一些共性能力,减少创建新项目时的一些重复操作,本着学习和分享的目的,本文会介绍 ...

  4. nginx 出现An error occurred错误

    原因是我nginx中conf文件的配置里面 location中的 这一块内容是 #注释的那两行 所以报错出现这个错误. 后来将这两行注释掉,改成这两个就好了. root html; index ind ...

  5. JS中通过Input中id获取输入框中的值

    HTML中 <input type="text" id="ONE" oninput="kpi()"> JS中 function ...

  6. 服务器宕机了,Kafka 消息会丢失吗?

    大家好,我是树哥. 消息队列可谓是高并发下的必备中间件了,而 Kafka 作为其中的佼佼者,经常被我们使用到各种各样的场景下.随着 Kafka 而来得,还有三个问题:消息丢失.消息重复.消息顺序.今天 ...

  7. docker安装dvwa

    docker run -d --name dvwa -p 8011:80 -p 33066:3306 -e MYSQL_PASS="password" citizenstig/dv ...

  8. python获取本机的安装所有应用( Windows)

    Windows获取本机的安装所有应用 采用操作注册表的方式,理论上其他可通过操作注册表方式的动作均可 import winreg def get_window_software(hive, flag) ...

  9. ZJOI2016 小星星 题解

    我一生之敌是状压 本文发表于 洛谷博客:https://www.luogu.com.cn/blog/LoveMC/solution-p3349 Cnblogs:https://www.cnblogs. ...

  10. 2537-springsecurity系列--关于session的管理2-session缓存和共享

    版本信息 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...