使用递归SQL实现树形参数的转换(后传前)

1、什么是递归SQL

递归 SQL(Recursive SQL)是一种 SQL 查询语言的扩展,它允许在查询中使用递归算法。递归 SQL 通常用于处理树形结构或层次结构数据,例如组织结构、产品分类、地理位置等。 递归 SQL 语句通常包含两个部分:递归部分和终止部分

递归部分定义了如何从一个节点到达下一个节点,而终止部分定义了递归何时结束。递归 SQL 语句通常使用 WITH RECURSIVE 关键字来定义

优点:在于它可以处理复杂的层次结构数据,而不需要编写复杂的程序或使用循环语句

缺点:存在性能、内存、可读性和数据一致性(多线程或分布式情况下)等问题


2、递归SQL的基本用法

例:创建一个递归主表 t1 ,由初始值1 开始,输出小于5的正整数

代码如下:

with recursive t1 as(

	select 1 as n		#从1开始,相当于初始值
	
	UNION ALL  #将初始条件与终止条件连接
	
	select n+1 from t1 where n<5	#递归语句终止条件

)

select * from t1;

输出结果:

使用递归SQL实现树形参数的转换(后传前)_第1张图片

 


3、案例演示

【前端】需要传入的部分参数样式:

JSON
 [
         {
            "childrenTreeNodes" : [
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-1-1",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "HTML/CSS",
                  "name" : "HTML/CSS",
                  "orderby" : 1,
                  "parentid" : "1-1"
               },
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-1-2",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "JavaScript",
                  "name" : "JavaScript",
                  "orderby" : 2,
                  "parentid" : "1-1"
               },
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-1-6",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "ReactJS",
                  "name" : "ReactJS",
                  "orderby" : 6,
                  "parentid" : "1-1"
               },
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-1-7",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "Bootstrap",
                  "name" : "Bootstrap",
                  "orderby" : 7,
                  "parentid" : "1-1"
               },
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-1-10",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "其它",
                  "name" : "其它",
                  "orderby" : 10,
                  "parentid" : "1-1"
               }
            ],
            "id" : "1-1",
            "isLeaf" : null,
            "isShow" : null,
            "label" : "前端开发",
            "name" : "前端开发",
            "orderby" : 1,
            "parentid" : "1"
         },
         {
            "childrenTreeNodes" : [
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-2-1",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "微信开发",
                  "name" : "微信开发",
                  "orderby" : 1,
                  "parentid" : "1-2"
               },
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-2-2",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "iOS",
                  "name" : "iOS",
                  "orderby" : 2,
                  "parentid" : "1-2"
               },
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-2-3",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "手游开发",
                  "name" : "手游开发",
                  "orderby" : 3,
                  "parentid" : "1-2"
               },
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-2-7",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "Cordova",
                  "name" : "Cordova",
                  "orderby" : 7,
                  "parentid" : "1-2"
               },
               {
                  "childrenTreeNodes" : null,
                  "id" : "1-2-8",
                  "isLeaf" : null,
                  "isShow" : null,
                  "label" : "其它",
                  "name" : "其它",
                  "orderby" : 8,
                  "parentid" : "1-2"
               }
            ],
            "id" : "1-2",
            "isLeaf" : null,
            "isShow" : null,
            "label" : "移动开发",
            "name" : "移动开发",
            "orderby" : 2,
            "parentid" : "1"
         }
   ]

对应的【数据库】表信息(这里只截取一部分):

使用递归SQL实现树形参数的转换(后传前)_第2张图片

这里,从数据库中的字段信息中可以看出,Id 与 parentId  是相关联的,所以需要采取自连接;但是,若级数多的情况下,使用平时的表自连接将会使SQL代码变得复杂且冗长,所以这里根据场景,使用SQL递归来进行多级信息的查询

代码实现:

with recursive t1 as(

	select * from course_category  where id = '1'   #初始值从根节点1开始
	
	union all	 #将初始条件与终止条件连接

	select t2.* from course_category t2 inner join t1  #然后采取自连接进行递归操作
	on t2.parentid = t1.id
)

select * from t1
ORDER BY t1.id

查询结果:

可见,得出的结果与数据库中的一致,查询成功 o(* ̄▽ ̄*)ブ

使用递归SQL实现树形参数的转换(后传前)_第3张图片


4、使用递归 SQL 的注意事项

  • 递归 SQL 的性能较差,因此在处理大量数据时需要谨慎使用
  • 递归 SQL 的语法较为复杂,需要仔细理解和掌握
  • 需要设置递归终止条件,否则可能会导致死循环
  • 递归 SQL 中的查询语句需要谨慎设计,避免出现重复数据或者数据丢失的情况
  • 需要注意数据库的版本和配置,不同的数据库可能会有不同的限制和特性
  • 需要注意数据的完整性和一致性,避免出现数据错误或者不一致的情况
  • 需要注意数据的安全性,避免出现数据泄露或者数据被篡改的情况

你可能感兴趣的:(java,mysql,java,mysql)