KingbaseES的SQL语句-CTE递归
背景
从上下级关系表中,任意一个节点数据出发,可以获得该节点的上级或下级。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递归的更多相关文章
- SQL笔记 - CTE递归实例:显示部门全称
昨天在整理JS的Function时,示例是一个递归函数.说起递归,想起前段时间在搞CTE,那个纠结呀,看似容易,可我总抓不住门道,什么递归条件,什么结束条件,一头雾水...今天一大早就爬起来,果然不负 ...
- Sql Server CTE递归
WITH cte AS ( SELECT a.FNUMBER,a.FMATERIALID AS MainId,b.FMATERIALID AS ChileID,CAST(b.FMATERIALID A ...
- sql server CTE递归使用测试
--CTE递归查询 if(object_id(N'menu') > 0) drop table menu CREATE TABLE MENU ( name nvarchar(50) NOT NU ...
- SQL笔记 - CTE递归实例(续):显示指定部门的全称
前一篇文章中已经可以取得所有部门的全称,但现在又有个新的需求: 只想得到某一个部门的部门全称,虽然可以用where条件来过滤,但是会有点小浪费. 这时我们可以从后往前找,先看下效果: 最后一条就是,行 ...
- SQL With(递归 CTE 查询)
本文来自:http://www.cnblogs.com/smailxiaobai/archive/2012/01/16/2323291.html 指定临时命名的结果集,这些结果集称为公用表表达式 (C ...
- SQL 递归查询,意淫CTE递归的执行步骤
今天用到了sql的递归查询.递归查询是CTE语句with xx as(....)实现的. 假如表Category数据如下. 我们想查找机枪这个子分类极其层次关系(通过子节点,查询所有层级节点).以下是 ...
- SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用
本文出处:http://www.cnblogs.com/wy123/p/5960825.html 我们在做开发的时候,有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连续的季度日期等等 ...
- 求SQL语句递归的算法
表结构是这样的 部门 上级部门 A BB CC DA AB BC C ...
- TSql CTE 递归原理探究
CTE是如何进行递归的?产生递归的条件有三个,分别是 初始值 自身调用自身 结束递归的条件 1,示例代码 ;with cte as ( as jd union all as jd from cte ) ...
随机推荐
- JavaScript写倒计时
在网页中,特别是电商网站中,倒计时的出现频率很高,接下来给大家介绍一下怎么用JavaScript写一个倒计时.代码如下: 首先我们通过Date构造函数的方法创建一个倒计时的结束的时间.并将其转换为毫秒 ...
- bat-设置oracle服务
1.停止oracle所有服务 并将服务设置为手动启动 @echo off echo oracle服务--------停止 net stop OracleVssWriterORCL net stop O ...
- OWL页面创建Copy功能,把选择内容复制到QC
- 广义径向基网络(RBF网络)
- 【百度飞桨】手写数字识别模型部署Paddle Inference
从完成一个简单的『手写数字识别任务』开始,快速了解飞桨框架 API 的使用方法. 模型开发 『手写数字识别』是深度学习里的 Hello World 任务,用于对 0 ~ 9 的十类数字进行分类,即输入 ...
- Solution -「Luogu 5170」类欧几里得算法
推柿子大赛了属于是. 题目要求三个柿子,不妨分别记为: \[\begin {align} f (a, b, c, n) &= \sum \limits _{i = 0} ^{n} \lfloo ...
- SpringMVC底层——请求参数处理流程描述
在DispatcherServlet.java的doDispatch方法中,springmvc通过handlermapping里面找哪个handler能处理请求,handler封装了目标方法的信息, ...
- 发布自己的npm组件库
发布自己的npm组件库 前期准备 **git上建立自己的仓库,这样子是为了在本地初始化时,可以直接生成对应的 package.json ** 克隆仓库 创建仓库成功后,gitbush本地,执行 git ...
- flex这些问题应该被理解
flex三连问,帮助我们更好的理解布局利器 问题: flex的值 auto, none, 0, 1, initial分别是什么?有什么作用?有什么表现? flex-basis和width的区别?单值f ...
- 自动挂载mount
# 自动挂载mount(/etc/fstab) /dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0 # 第一列:/dev/fd0 挂载源 ...