首页 > 数据库 > 数据库综合 > 正文

SQL数据库实现递归查询的几种代码方法

互联网 2018-05-15 11:29:28 0

SQL数据库实现递归查询的几种代码方法
表结构

ProductCategory

CategoryID,Level,ParentCategoryID

数据

1,1,-1

2,1,-1

3,2,1

4,3,3

5,2,2

6,4,5

T-SQL

WITH CategoryTemp(CategoryID,ParentCategoryID)--临时表用来保存查到的Category

(

  SELECT CategoryID,ParentCategoryID FROM ProductCategory WHERE ParentCategoryID<=0--将所有的第一层查出来作为初始数据,需要查第几层或者哪个ParentCategoryID下面所有的 N层,把ParentCategoryID赋相关的值即可

  UNION ALL--查询N层

  SELECT pc.CategoryID,ParentCategoryID FROM ProductCategory pc

  LEFT JOIN CategoryTemp ct ON pc.ParentCategoryID=ct.CategoryID

  WHERE ParentCategoryID>0--因为第一层前面已经查出来了,所以这里把第一层筛选掉

)

SELECT CategoryID,ParentCategoryID FROM CategoryTemp

结果

1,-1

2,-1

3,1

4,3

5,2

6,5

如果把ParentCategoryID赋为2,结果则为

5,2

6,5

实例

ID 是否为部门   部门名   上级ID
1       y                       部门0       1
31     y                       部门1       1
32     n                       张三         31
33     n                       李二         31
34     y                       部门2       31
35     n                       王五         34
35     y                       部门3 34
36     n                       小三         35
我想找询   ID   值为   35   下级的所有人员包括下级部门的所有人员

--创建查询函数
create   function   f_id(
@id   int --要查询的id
)returns   @re   table(id   int,level   int)
as
begin
declare   @l   int
set   @l=0
insert   @re   select   id,@l
from   表  
where   上级id=@id
while   @@rowcount> 0
begin
set   @l=@l+1
insert   @re   select   a.id,@l
from   表   a   join   @re   b   on   a.上级id=b.id   and   b.level=@l-1
end
return
end
go

--调用函数进行查询
select   a.*   from   表   a   join   f_id(35)   b   on   a.id=b.id

联合查询

--测试数据
create   table   表(ID   int,是否为部门   char(1),部门名   varchar(10),上级ID   int)
insert   表   select   1   , 'y ', '部门0 '   ,1
union   all   select   31, 'y ', '部门1 '   ,1
union   all   select   32, 'n ', '张三 '   ,31
union   all   select   33, 'n ', '李二 '   ,31
union   all   select   34, 'y ', '部门2 ',31
union   all   select   35, 'n ', '王五 '   ,34
union   all   select   35, 'y ', '部门3 ',34
union   all   select   36, 'n ', '小三 '   ,35
go

--创建查询函数
create   function   f_id(
@id   int --要查询的id
)returns   @re   table(id   int,level   int)
as
begin
declare   @l   int
set   @l=0
insert   @re   select   id,@l
from   表  
where   上级id=@id
while   @@rowcount> 0
begin
set   @l=@l+1
insert   @re   select   a.id,@l
from   表   a   join   @re   b   on   a.上级id=b.id   and   b.level=@l-1
end
return
end
go

--调用函数进行查询
select   a.*   from   表   a   join   f_id(35)   b   on   a.id=b.id
go

--删除测试
drop   table   表
drop   function   f_id

/*--测试结果

ID                     是否为部门   部门名                 上级ID                
-----------   -----   ----------   -----------  
36                     n           小三                   35

(所影响的行数为   1   行)

  • 相关标签:
  • 版权归原作者所有,如果有侵犯到您的权益,请联系本站删除!
  • 相关文章


    • 暂无相关信息

    专题推荐

    今日头条
  • 学习Python的正确姿势 学习Python的正确姿势
  • Google Chrome 58.0.3029.96 正式版发布 Google Chrome 58.0.3029.96 正式版发布
  • Docker公司更换 CEO,将着重发力商业变现 Docker公司更换 CEO,将着重发力商业变现
  • 优酷播放器 一款无优酷LOGO的精美优酷播放器代码 优酷播放器 一款无优酷LOGO的精美优酷播放器代码
  • 热门标签