问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用一段SQL语句递归找到一个目录下的所有子目录

发布网友 发布时间:2022-04-08 05:47

我来回答

1个回答

热心网友 时间:2022-04-08 07:16

有一个存储目录树的表,定义目录间的关系字段有两个:
如下:(ClassID表示该目录的编号,ClassParentID表示它的父目录的编号)

ClassID ClassParentID
1 1
2 1
3 2
4 3
5 3

表示的关系应该是

-1--(根目录)
|
-2--(第二级目录)
|
-3--(第*目录)
|
-4--(第四级目录)
|
-5--(第四级目录)

这样的目录关系.

那么我通过知道一个目录的ClassID,如何通过一条SQL语句找到所有该目录的子目录?

如:

"SELECT * FROM 表 WHERE ClassParentID = "+ClassID+"and ClassParentID <>"+ClassID

但只能找到第一层的子目录,如何找到所有子目录,请大家给一条SQL语句实现!!

(因为事先不知道目录有多少层,当然一定是一条带有while循环的SQL语句)

1、

create table Test2
(
ClassID int,
ClassParentID int,
)
go

create proc Test2_proc
@nClassParentID int -- 要查询的父节点ID 号
as
begin
set nocount on
--
declare @nClassID int,
@nIndex int
-- create TempTable
create table #ClassIDTemp
(
nIndex int identity(1,1),
ClassID int,
ClassParentID int,
nFlag int default(0),
)
create index #ClassIDTemp_Index on #ClassIDTemp(nIndex)

-- insert First RecordSet

insert into #ClassIDTemp(ClassID,ClassParentID) select
ClassID,ClassParentID from Test2 where ClassParentID =
@nClassParentID order by ClassParentID
-- Circle
while(0=0)
begin

select top 1 @nIndex = nIndex, @nClassID = ClassID
from #ClassIDTemp where nFlag = 0 order by nIndex
asc
if @@rowcount = 0
break
else
begin

insert into #ClassIDTemp(ClassID,ClassParentID) select
ClassID,ClassParentID from Test2 where ClassParentID =
@nClassID order by ClassParentID
end
update #ClassIDTemp set nFlag = 1 where nIndex = @nIndex
end

-- Select Result
select ClassID,ClassParentID from #ClassIDTemp order by nIndex
if exists(select * from sysobjects where name = '#ClassIDTemp')
drop table #ClassIDTemp
end
go

2、

declare @Table table ( ClassID int primary key , ClassParentID int)
declare @Test table ( ClassID int primary key , ClassParentID int)

insert into @Table values ( 1, 0 ) -- 建议这里是 1,0 而不是 1, 1
insert into @Table values ( 2, 1 )
insert into @Table values ( 3, 2 )
insert into @Table values ( 4, 3 )
insert into @Table values ( 5, 3 )

insert into @Test select * from @Table where ClassID = 2

while exists ( select * from @Table A
inner join @Test B
on A.ClassParentID = B.ClassID
where A.ClassID not in ( select ClassID from @Test ) )
begin
insert into @Test
select A.* from @Table A
inner join @Test B
on A.ClassParentID = B.ClassID
where A.ClassID not in ( select ClassID from @Test )
end

select * from @Test

3、

sql1 = "(SELECT ClassID FROM 表 WHERE ClassParentID =" + 变量 + ")"

sql2 = "(SELECT ClassID FROM 表 WHERE (ClassParentID IN
"+ sql1 + ") OR (ClassID IN " + sql1 + "))"

sql = "SELECT * FROM 表 WHERE ClassParentID IN " + sql2 + " OR ClassID IN " + sql2

这个办法可实现1到4级的所有情况(包括只有2级、3级的情况)

4、--我的方法是用自定义函数实现,这样具有通用性

--测试

--测试数据
create table 表(ClassID int,ClassParentID int)
insert 表 select 1,0
union all select 2,1
union all select 3,2
union all select 4,3
union all select 5,3
go

--自定义函数,返回指定目录下的所有子目录列表
create function f_child(@ClassID int)
returns @re table(ClassID int,Level int)
as
begin
declare @l int
set @l=0
insert @re select @ClassID,@l
while @@rowcount>0 --直接用@@rowcount判断
begin
set @l=@l+1
insert @re select a.ClassID,@l
from 表 a join @re b on a.ClassParentID=b.ClassID
where b.level=@l-1
end
return
end
go

--调用函数实现查询
select a.* from 表 a join dbo.f_child(1) b on a.ClassID=b.ClassID
go

--加上缩进效果
select ClassID=space(b.level*4)+cast(a.ClassID as varchar),a.ClassParentID
from 表 a join dbo.f_child(1) b on a.ClassID=b.ClassID

go
--删除测试环境
drop table 表
drop function f_child

/*--测试结果
ClassID ClassParentID
----------- -------------
1 0
2 1
3 2
4 3
5 3

(所影响的行数为 5 行)

ClassID ClassParentID
-------------- ----------------
10
2 1
3 2
4 3
5 3

(所影响的行数为 5 行)
--*/
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 一汽大众两厢轿车车型有哪些 美团外卖只赔付餐损价的百分之七十合理吗 美团怎么申请餐损赔付 在微信我的小程序哥哥打大A怎么去掉托管 哥哥打大a小程序怎么充值 微信小程序里的哥哥打大A祈福转运是就自己能看到吗 大家一起来给点意见~我我该做什么项目呢??要新颖~要连接数据库的!! 企业计划管理的计划管理中的系统工程方法 微信小程序天天斗地主怎么拿好牌 微信小程序打大a怎么让牌变好 联动云调度用户不存在 联动云日租一天可以临时停车吗? 联动云第一次开多久不要钱 联动云首次免费是指身份信息还是支付宝号 我的JOYROOM坏掉了怎么拆开 joyroom蓝牙音箱死机长按电源键也关不了机,求大神指点 joyroom蓝牙音箱开不了机了怎么办?? JOYROOM蓝牙音箱死机怎么关机 三道鳞和鲤鱼哪个好吃 红烧三道鳞的介绍 逍遥安卓模拟器使用久了就越来越慢,有什么办法可以解决的吗? w7系统逍遥模拟器网速慢怎么办。下载也慢。。怎么办?ps:官网的攻略我看不懂 求教,模拟器显示网络不给力怎么破 安卓模拟器的网络有问题,怎么解决?下面图加载好久。。 逍遥模拟器上不了网 什么情况 为什么安卓模拟器网络会不稳定 四分钟学会cad2007画货架第二个步骤是什么,用的什么工具 求一个货架的CAD图纸 这样的货架CAD图的施工图怎么画啊长3500高800宽800 用CAD画货架,工作台的效果图,怎么画啊,需要哪些模块呢,高手给指点一下啊 学会画CAD货架要多长时间啊? 我入驻网易云音乐人,上传翻唱作品,人声干音也交了,回复说不确定为本人演唱? 陌陌引流脚本真的有吗?陌陌引流脚本怎么下载? 有部电视剧男主角叫霍辞,女主角叫虞安宁的是什么名字? 主角虞安宁 霍辞的电视剧叫什么? 男主角叫霍辞,女主角叫虞安宁的电视剧叫什么名字? 陌陌怎么附近动态自动点赞打招呼? 怎么编辑mp4文件 如何编辑的MP4大小(分辨率)参数? 万圣节除了做南瓜灯还有什么