背景

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

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

举例

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

drop table t_level1;
create table t_level1
(
id int primary key,
pid int
); create index t_level1_pid on t_level1 (pid); --Sequence For Primary key
create sequence seq_level1; select count(*) from t_level1;
truncate t_level1; --方法一:使用表作为record type,生成record数组
with recursive rec as (
--Root Node
select array_agg((id, pid)::t_level3) as recs,
5 as max_lvl, --最大level
5 as rec_cnt --最大子节点数
from (select nextval('seq_level1') as id, null as pid) t
union all
--Children Node, Random Number
select array_agg((id, pid)::t_level3) as recs,
recp.max_lvl as max_lvl,
rec_cnt as rec_cnt
from (select (unnest(rec.recs)).id as pid,
rec.max_lvl - 1 as max_lvl,
rec_cnt as rec_cnt
from rec
where rec.max_lvl > 1) as recp
, lateral (select nextval('seq_level1') as id
from generate_series(1, (random() * rec_cnt)::int)
where pid > 0) t2
group by pid, max_lvl, rec_cnt
)
select (unnest(recs)).*
from rec; --方法二:使用主键作为type,生成主键类型数组
with recursive rec as (
--Root Node
select array_agg(nextval('seq_level1')) as ids,
null::bigint as pid,
5 as max_lvl, --最大level
5 as rec_cnt --最大子节点数
union all
--Children Node, Random Number
select (select array_agg(nextval('seq_level1')) as ids
from generate_series(1, (random() * rec_cnt)::int)
) as ids,
pid as pid,
max_lvl as max_lvl,
rec_cnt as rec_cnt
from (select unnest(rec.ids) as pid,
rec.max_lvl - 1 as max_lvl,
rec_cnt as rec_cnt
from rec
where rec.max_lvl > 1) as recp
)
select unnest(ids) as id, pid, max_lvl
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. 从0到1搭建一款Vue可配置视频播放器组件(Npm已发布)

    前言 话不多说,这篇文章主要讲述如何从0到1搭建一款适用于Vue.js的自定义配置视频播放器.我们平时在PC端网站上观看视频时,会看到有很多丰富样式的视频播放器,而我们自己写的video标签样式却是那 ...

  2. python基础知识-day7(文件操作)

    1.文件IO操作: 1)操作文件使用的函数是open() 2)操作文件的模式: a.r:读取文件 b.w:往文件里边写内容(先删除文件里边已有的内容) c.a:是追加(在文件基础上写入新的内容) d. ...

  3. jdbc连接数据库问题

    ### Error querying database.  Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Fail ...

  4. DTCC 干货分享:Real Time DaaS - 面向TP+AP业务的数据平台架构

      2021年10月20日,Tapdata 创始人唐建法(TJ)受邀出席 DTCC 2021(中国数据库技术大会),并在企业数据中台设计与实践专场上,发表主旨演讲"Real Time Daa ...

  5. Acwing八数码

    此题用\(bfs\) 首先我们可以定义两个重要的数组 \(unordered\_map<string,int> d\)表示\(string\)距离\(start\)的交换次数 \(queu ...

  6. Object类的toString方法和equals方法

    Object类 概述 java.long.Object 类是java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终的父类就是Object 类Object是类层 ...

  7. linux学习(小白篇)

    当前服务器:centos 7 shell命令框:xshell 文件预览及上传:xftp (界面化软件,非常好用) 数据库连接:navicat 此文是在学习linux时做一个指令合集,方便自己查阅 进文 ...

  8. 干货分享:小技巧大用处之Bean管理类工厂多种实现方式

    前言:最近几个月很忙,都没有时间写文章了,今天周末刚好忙完下班相对早点(20:00下班)就在家把之前想总结的知识点写出来,于是就有了这篇文章.虽无很高深的技术,但小技巧有大用处. 有时我们经常需要将实 ...

  9. Nginx 平滑升级、Nginx的一些基础配置

    # Nginx 平滑升级 # 方案一:使用Nginx服务信号进行升级 # 1.将就版本的sbin目录下可执行nginx进行备份(mv nginx nginxold) # 2.将新版本 configur ...

  10. Linux环境监控工具汇总

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. Linux 操作系统有诸多自带和第三方的监控工具,以下从不同维度来整理常用的一些监控工具. CPU top(经典的Linu ...