SQL WITH 递归查询
如果表时存放的是树状的数据(如权限、系统模块等)面我们需要根据其中的一条记录查询出它的所有子集记录的话,这篇文章就是最好的解决办法。
直接例子:下面是我的表
表中存放的是后台系统的功能模块信息,ModuleID表示模块的编号、MoudleName表示模块名、ModuleFather表示模块的父级编号(如果为0则表示自己是最高级的)。
现在我们要查询出OA管理的所有子模块(不限级)。
由SQL语句如下。
查询结果为:
上面说了不限级,其实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