SQL WITH 递归查询

 

 

  如果表时存放的是树状的数据(如权限、系统模块等)面我们需要根据其中的一条记录查询出它的所有子集记录的话,这篇文章就是最好的解决办法。

  直接例子:下面是我的表

模块表.JPG

  表中存放的是后台系统的功能模块信息,ModuleID表示模块的编号、MoudleName表示模块名、ModuleFather表示模块的父级编号(如果为0则表示自己是最高级的)。

  现在我们要查询出OA管理的所有子模块(不限级)。

  由SQL语句如下。

   查询结果为:

 

 

查询结果.JPG

       上面说了不限级,其实SQL还是有限制的,默认好像是1000级,但我们有时候想看下这些数据能否执行多少级,我们就可以在上面查询的结尾处加上:OPTION(MAXRECURSION  级数)

       如果我们在写SQL的时候要求只返回前M级的数据,那么我们可以在上面的查询结果中加一个级数,每递归一次级数加1 ,最后在条件里加上级数限制,代码如下:

 

01.WITH Modules(ModuleId,ModuleName,ModuleFather,ModuleSort,Lev)
02.AS
03.(
04.SELECT ModuleId,ModuleName,ModuleFather,ModuleSort,0
05.FROM dbo.Module
06.WHERE ModuleId=1
07.UNION ALL
08.SELECT m.ModuleId,m.ModuleName,m.ModuleFather,m.ModuleSort,Lev+1
09.FROM dbo.Module m
10.INNER JOIN Modules a
11.ON a.ModuleId=m.ModuleFather
12.)
13. 
14.SELECT m.ModuleId,m.ModuleName,m.ModuleFather,m.ModuleSort
15.FROM Modules m
16.INNER JOIN dbo.Module mod
17.ON m.ModuleFather=mod.ModuleId
18.--级数限制
19.WHERE Lev<3

 

 

posted @ 2009-08-05 00:31  齐.net  阅读(899)  评论(1编辑  收藏  举报