数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

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


发布日期:2019年06月05日
 
SQL数据库实现递归查询的几种代码方法

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 小三

(所影响的行数为 行)

上一篇:复制本地数据库中的一个表到远程数据库

下一篇:SQLSERVER数据库备份后无法还原的解决办法