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

时间:2016.04.16 发布人:ayvefskqc

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

已解决问题

谷歌ayvefskqc用户在2016.04.16提交了关于“永兴岛SQL**库实现递归查询的几种代码方法”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-19T21:21:16。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,希望你能感受到,我最真诚的谢意 !

希望以下的回答,能够帮助你。

第1个回答

用户名:rsw81nrnh  

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

Pro**ctCategory

CategoryID,Level,ParentCa问答tegoryID

**

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

(

  **LECTCategoryID,ParentCategoryIDFROMPro**ctCategoryWh**EREParentCategoryID<=0--将所有的第一层查出来作为初始**,需要查第几层或者哪个ParentCategoryID下面所有的N层,把ParentCategoryID赋相关的值即可

  UNIONALL--查询N层

  **LECTpc.CategoryID,ParentCategoryIDFRO组假果MPro**ctCategorypc

  LEFTJOINCategoryTempctONpc.ParentCategoryID=ct.CategoryID

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

)

**LECTCa植价水列乐气tegoryID,ParentCategoryIDFROMCategoryTemp

结果

1,-1

2,-1

3,1

4,3

5,2

6,5

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

5,2

6,5

实例

ID院 是否为部门部非状烈候位门名上级ID
1y部门01
31y部门11
32n张三31
33n李二31
34y部门231
35n王五34
35y部井皇门3 34
36n**35
该药镇秋想找询ID值为35下级的所有人员包括下级部门的所有人员

--创建查询函数
cre历翻陆套依atefunctionf_id(
@idint--要查询的id
)木尽温returns@retabl唱黑地额e(idint,levelint)
as
begin
de握能艺东clare@百几殖映居征lint
set@l=0
热干重剂论究经刚insert@r紧雨岩鲜花显血eselectid,@l
from表
where上级id=@id
while@@rowc熙统新铁织渐ount>0
begin
set@l=@l+1
insert@reselecta.id,@l
from表ajoin@rebona.上级id=b.idandb.level=@l-1
end
return
end
go

--部调用函数进行查询
selecta.*from表ajoinf_id(35)bona.id=b.id

联合查询

--测试**
createtable表(IDint,是否为部门char(1),部门名varchar(10),上级IDint)
insert表select1,'y','部门0',1
unionallselect31,'y','部门1',1
unionallselect32,'n','张三',31
unionallselect33,'n','李二',31
unionallselect34,'y','部门2',31
unionallselect35,'n','王五',34
unionallselect35,'y','部门3',34
unionallselect36,'n','**',35
go

--创建查询函数
createfunctionf_id(
@idint--要查询的id
)returns@retable(idint,levelint)
as
begin
declare@lint
set@l=0
insert@reselectid,@l
from表
where上级id=@id
while@@rowcount>0
begin
set@l=@l+1
insert@reselecta.id,@l
from表ajoin@rebona.上级id=b.idandb.level=@l-1
end
return
end
go

--调用函数进行查询
selecta.*from表ajoinf_id(35)bona.id=b.id
go

--删除测试
droptable表
dropfunctionf_id

/*--测试结果

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

(所影响的行数为1行)