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

准备

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

列名 描述
id 机构ID
pid 上级机构ID
name 机构名称

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

with recursive cte as
(select pc1.* from org pc1 where pc1.id in ('000000')union allselect 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

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 allselect 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和它的所有上级,且以链路的形式显示

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 allselect 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

with recursive fibonacci as
(select 1 as n, 0 as fib_n,1 as next_fib_nunion allselect n+1, next_fib_n, fib_n+next_fib_n from fibonacci where n < 40
)select * from fibonacci;

方法2

with recursive fibonacci(n,fib_n,next_fib_n) as
(select 1, 0 ,1union allselect n+1, next_fib_n, fib_n+next_fib_n from fibonacci where n < 40
)select * from fibonacci;

SQL中with recursive用法案例详解相关推荐

  1. python编程字典100例_python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...

  2. html中使用volist要引入什么,thinkphp中volist标签使用案例详解

    这次给大家带来thinkphp中volist标签使用案例详解,thinkphp中volist标签使用的注意事项有哪些,下面就是实战案例,一起来看一下. 属性: name(必须):要输出的数据模板变量 ...

  3. java list详解_Java 中 list 用法案例详解

    LIST是个容器接口可以理解为动态数组,传统数组必须定义好数组的个数才可以使用,而容器对象无须定义好数组下标总数,用add()方法即可添加新的成员对象,他可以添加的仅仅只能为对象,不能添加基本数据类型 ...

  4. python类初始化导入库_Python中optparser库用法实例详解

    本文研究的主要是Python中optparser库的相关内容,具体如下. 一直以来对optparser不是特别的理解,今天就狠下心,静下心研究了一下这个库.当然了,不敢说理解的很到位,但是足以应付正常 ...

  5. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  6. python中for语句用法_详解Python中for循环的使用_python

    这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程&q ...

  7. python print函数用法_Python3.2中Print函数用法实例详解

    本文实例讲述了Python3.2中Print函数用法.分享给大家供大家参考.具体分析如下: 1. 输出字符串 >>> strHello = 'Hello World' >> ...

  8. JavaScript中window.open用法实例详解

    本文较为详细的分析了JavaScript中window.open用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: <script LANGUAGE="javascript& ...

  9. php定义枚举,PHP中Enum(枚举)用法实例详解

    本文实例讲述了PHP中Enum(枚举)用法.分享给大家供大家参考,具体如下: PHP其实有Enum类库的,需要安装perl扩展,所以不是php的标准扩展,因此代码的实现需要运行的php环境支持. (1 ...

最新文章

  1. verilog基础篇RAM IP核的使用
  2. 返回1到n的所有组合python_如何在Python中生成0-1矩阵的所有可能组合?
  3. erp沙盘采购总监的心得_erp沙盘模拟采购总监心得
  4. wxWidgets:wxUpdateUIEvent类用法
  5. 西门子博图的FB块_西门子S7-300/400PLC OB-FB-FC-DB块介绍
  6. hdu 2275 Kiki Little Kiki 1 水题
  7. 处理2D图像和纹理——创建2D菜单界面
  8. laravel连接mysql连接数过多_php – Laravel 4和MySQL的连接太多了
  9. QTreeWidget样式qss
  10. 腾讯云即时通信IM知识详解
  11. 云计算、分布式计算、并行计算、网格计算、集群
  12. ASP.NET在线考试系统+文档说明
  13. 这款安全好用的手机浏览器,真是一股清流,值得点赞
  14. 七彩虹将星 X15 AT 2023 参数配置 七彩虹将星 X15 AT 评测
  15. Linux网络连接命令
  16. Android Wear与Apple Watch交互设计对比
  17. 广域网(WAN)简介
  18. 达梦数据文件误删了恢复
  19. Bullet physics 引擎的官方文档翻译
  20. Rust - Rocket框架 -基础入门

热门文章

  1. python——冒泡算法
  2. 微积分 --- 欧拉数e的计算方法(个人学习笔记)
  3. Delphi中如何控制打印方向,纸张大小等
  4. python处理二进制文件_python文件操作之二进制
  5. 【漫漫转码路】Python Day 27
  6. Kooboo完全介绍二:创建第一个Kooboo站点
  7. el-table高度根据内容自适应且设置最大高度
  8. 谷歌大动作!TPU超算系统大升级,全面超越英伟达A100
  9. ​Python中的经典时间序列预测模型总结
  10. 设备树中ranges属性理解