扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
不知道你是不是访问数据库,我最近也再写个项目,需要递归一个节点下面的所有子节点,我自己写了两个存储过程!注意是嵌套的,我的表结构为id,title,parent,如下:
成都创新互联长期为数千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为梅河口企业提供专业的成都网站设计、做网站,梅河口网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
CREATE proc getChildTNode
@selectid int --这里是传入一个你选择的节点id
as
declare @id int--声明了一个游标变量id
insert #temp select * from tree where parent=@selectid --先插入parent字段为选择id的所有子节点
declare MyCursor cursor local for select [id] from tree where parent=@selectid--声明游标
open MyCursor--打开游标
fetch next from MyCursor into @id--读取下一行
while(@@fetch_status = 0)--判断,至于为什么要判断=0,就不用追究了
begin
exec getChildTNode @id --递归调用
fetch next from MyCursor into @id --将下一个节点id放进id变量作为父节点遍历
end
close MyCursor--关闭游标
deallocate MyCursor--什邡游标
这里还没有完,还有以下调用上面这个存储过程
CREATE proc getChildTNodes
@select int--同上面的定义一个父节点变量
as
create table #temp(
[id] int,
title varchar(50),
parent int,
)--建立一个临时表
exec getChildTNode @select--执行上面定义的存储过程,并传入父节点参数
select * from #temp--递归完成后,选择所有子节点数据
我用的是sqlserver数据库,如果你不是数据库的话,再来探索下,我只是做了存储过程,我相信C#代码还是和这个类似吧!希望对你有帮助
CREATE TABLE #tb1(stuId INT,stuName VARCHAR(30),teaId INT);
INSERT INTO #tb1 (stuId,stuName,teaId)
VALUES(1,'zhou',0),(2,'kong',0),(3,'hong',2),(4,'zhang',1),(5,'liu',4),
(6,'zhao',5),(7,'zheng',6),(8,'wei',7)
;WITH cte AS (
SELECT t.stuId,t.stuName,t.teaId FROM #tb1 AS t
WHERE t.stuId=8
UNION ALL
SELECT t.stuId,t.stuName,t.teaId FROM cte AS c
JOIN #tb1 AS t ON c.teaId=t.stuId
)
SELECT * FROM cte
用标准sql的with实现递归查询(sql2005以上肯定支持,sql2000不清楚是否支持):
with subqry(id,name,pid) as (
select id,name,pid from test1 where id = 5
union all
select test1.id,test1.name,test1.pid from test1,subqry
where test1.pid = subqry.id
)
select * from subqry;
你的意思没特别看懂,但是在ORACLE里面的递归语法是:
select * from tab ...start with ... connect by col_parent...
你可以查一下start with ,connect 的语法
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流