SQL数据库实现递归查询的几种代码方法
表结构
ProductCategory
CategoryIDLevelParentCategoryID
数据
TSQL
WITH CategoryTemp(CategoryIDParentCategoryID)临时表用来保存查到的Category
(
SELECT CategoryIDParentCategoryID FROM ProductCategory WHERE ParentCategoryID<=将所有的第一层查出来作为初始数据需要查第几层或者哪个ParentCategoryID下面所有的 N层把ParentCategoryID赋相关的值即可
UNION ALL查询N层
SELECT pcCategoryIDParentCategoryID FROM ProductCategory pc
LEFT JOIN CategoryTemp ct ON pcParentCategoryID=ctCategoryID
WHERE ParentCategoryID>因为第一层前面已经查出来了所以这里把第一层筛选掉
)
SELECT CategoryIDParentCategoryID FROM CategoryTemp
结果
如果把ParentCategoryID赋为结果则为
实例
ID是否为部门 部门名 上级ID
y 部门
y 部门
n 张三
n 李二
y 部门
n 王五
y 部门3
n 小三
我想找询 ID 值为 下级的所有人员包括下级部门的所有人员
创建查询函数
create function f_id(
@id int 要查询的id
)returns @re table(id intlevel int)
as
begin
declare @l int
set @l=
insert @re select id@l
from 表
where 上级id=@id
while @@rowcount>
begin
set @l=@l+
insert @re select aid@l
from 表 a join @re b on a上级id=bid and blevel=@l
end
return
end
go
调用函数进行查询
select a* from 表 a join f_id() b on aid=bid
联合查询
测试数据
create table 表(ID int是否为部门 char()部门名 varchar()上级ID int)
insert 表 select y 部门
union all select y 部门
union all select n 张三
union all select n 李二
union all select y 部门
union all select n 王五
union all select y 部门
union all select n 小三
go
创建查询函数
create function f_id(
@id int 要查询的id
)returns @re table(id intlevel int)
as
begin
declare @l int
set @l=
insert @re select id@l
from 表
where 上级id=@id
while @@rowcount>
begin
set @l=@l+
insert @re select aid@l
from 表 a join @re b on a上级id=bid and blevel=@l
end
return
end
go
调用函数进行查询
select a* from 表 a join f_id() b on aid=bid
go
删除测试
drop table 表
drop function f_id
/*测试结果
ID 是否为部门 部门名 上级ID
n 小三
(所影响的行数为 行)