龙空技术网

数据库大师成长日记:浅论通过SQL语句实现递归查询

网云技术 375

前言:

此刻咱们对“递归的字段匹配算法”都比较注意,兄弟们都需要知道一些“递归的字段匹配算法”的相关内容。那么小编也在网络上网罗了一些对于“递归的字段匹配算法””的相关内容,希望小伙伴们能喜欢,姐妹们快快来了解一下吧!

对于经常写各种程序的朋友来说,递归调用是程序绕不开的话题,比如我们要生成一颗拥有层次关系的部门树等。程序中的递归,无非是函数或过程调用自身,根据某种关联关系自动将数据的层级关系梳理出来。但在数据库中,有没有办法直接通过递归把数据梳理出来呢?

我们存入数据库表的数据,比如部门员工数据,很可能放在同一个表中,部门员工的数据又是分层级的,但数据的插入可能是无序的。我们如何通过SQL语句将数据按照层级梳理出来呢?

通过SQL语句实现递归查询,当然也可以通过定义自定义函数使用游标、通过递归调用来实现,考虑到脚本的简洁和效率,这种方式肯定是不合适的。

那如何实现呢?推荐用公用表表达式。下面我们就通过一个表变量存放部门员工数据,通过公用表表达式的递归调用实现部门员工数据的递归查询。

演示数据准备

直接先上脚本:

declare @data table( FDataID int, FParentID int, FName nvarchar(255), FIsNode tinyint);insert into @data values(1,0,'销售一部',1),(2,1,'张三',0),(3,0,'销售二部',1),(4,1,'李四',0),(5,3,'王五',1);

这里定义了一个表变量@data,其中有两个部门,销售一部和销售二部,三个员工张三、李四、王五,此时数据库中的数据是混乱的,我们无法区分数据的层级。

参看下图:

这里FDataID是数据的内码,FParentID是数据的上级内码,FName是数据名称。

使用公用表表达式显示递归查询

直接先上脚本:

with mycte as( select FDataID,FParentID,FName,0 as FLevel from @data where FParentID=0 union all select t1.FDataID,t1.FParentID,t1.FName,FLevel+1 as FLevel from @data t1 inner join mycte t2 on t1.FParentID=t2.FDataID)select * from mycte;

这里定义了公用表表达式mycte,第一条初始查询限定了读取的基础数据,这里通过FParentID=0这个条件限定了读取的基础数据是最顶层的两个节点;紧接着的第二条对递归进行了定义,表变量连接公用表表达式mycte,通过递归条件t1.FParentID=t2.FDataID实现递归。其中定义的字段FLevel记录了节点的层级。

运行效果如下图:

通过上图可以看出,数据按照层级做了梳理,其中FLevel将数据的层级理了出来,这样看上去是不是简洁多了呢?

不过,这样的递归结果未必是我们需要的,比如这里列出来的数据,并不能够将数据的层次关系直接展示出来,换言之,我们想要的可能就是一颗有层次的数据关系树,这个确实较难实现,留待下一讲我们继续讨论吧。

标签: #递归的字段匹配算法