前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >SQL中with recursive用法案例详解

SQL中with recursive用法案例详解

作者头像
leehao
发布2025-02-11 11:09:34
发布2025-02-11 11:09:34
10400
代码可运行
举报
文章被收录于专栏:leehaoleehao
运行总次数:0
代码可运行

SQL提供了递归查询,可将当前查询结果作为下一次的查询集合进行再次查询,最后得到我们想要的结果。 关键字 with recursive

准备

假设我们有一张机构表org,如下:

列名

描述

id

机构ID

pid

上级机构ID

name

机构名称

查询当前机构和它的所有下级,以列表形式显示

代码语言:javascript
代码运行次数:0
复制
with recursive cte as
(
	select pc1.* from org pc1 where pc1.id in ('000000')
	union all
	select pc2.* from org pc2 inner join cte c on c.id=pc2.pid
)

select ct.* from cte ct;

从上到下,以链路形式追加

如获取某个机构ID和它所有的下级,且以链路的形式显示 机构ID: a>b>c>d 机构名称:机构1>机构2>机构3>机构4

代码语言:javascript
代码运行次数:0
复制
with recursive cte as
(
	select pc1.id,
	cast(pc1.id as varchar(500)) as id_seq,
	cast(pc1.name as varchar(500)) as name_seq, 
	from org pc1 where pc1.id in ('000000')

	union all
	
	select pc2.id,
	cast(c.id_seq || '>' || pc2.id  as varchar(500)) as id_seq,
	cast(c.name_seq || '>' || pc2.name   as varchar(500)) as name_seq, 
	from org pc2 inner join cte c on c.id=pc2.pid
)

select ct.* from cte ct;

从下到上 获取链路

如获取某个机构ID和它的所有上级,且以链路的形式显示

代码语言:javascript
代码运行次数:0
复制
with recursive cte as
(
	select 
	pc1.id,
	pc1.pid,
	cast(pc1.id as varchar(500)) as id_seq,
	cast(pc1.name as varchar(500)) as name_seq, 
	from org pc1 where pc1.id in ('66666')

	union all
	
	select 
	pc2.id,
	pc2.pid,
	cast(pc2.id || '>' || c.id_seq  as varchar(500)) as id_seq,
	cast(pc2.name || '>' || c.name_seq   as varchar(500)) as name_seq, 
	from org pc2 inner join cte c on c.pid=pc2.id
)

select ct.* from cte ct;

彩蛋

利用with recursive实现斐波那契数列

方法1
代码语言:javascript
代码运行次数:0
复制
with recursive fibonacci as
(
	select 1 as n, 0 as fib_n,1 as next_fib_n

	union all
	
	select n+1, next_fib_n, fib_n+next_fib_n from fibonacci where n < 40
)

select * from fibonacci;
方法2
代码语言:javascript
代码运行次数:0
复制
with recursive fibonacci(n,fib_n,next_fib_n) as
(
	select 1, 0 ,1

	union all
	
	select n+1, next_fib_n, fib_n+next_fib_n from fibonacci where n < 40
)

select * from fibonacci;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 查询当前机构和它的所有下级,以列表形式显示
  • 从上到下,以链路形式追加
  • 从下到上 获取链路
  • 彩蛋
    • 方法1
    • 方法2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档