存储过程:数据库的树结构表的遍历

YuanBao20090422 2009-04-30 01:40:43
表的结构

ID, Name, ManagerID,ManagerName (类似多叉树,一个Manager 可以有多个下属。)

现在想对这个表进行遍历,父结点->左子树->右子树 怎么用存储过程实现。谢谢大家。
其中同一个父节点的所有子结点按ID由大到小排序。
例如:

...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
YuanBao20090422 2009-05-15
  • 打赏
  • 举报
回复
万分感谢yangsnow_rain_wind
YuanBao20090422 2009-05-03
  • 打赏
  • 举报
回复
SQL server 2000如何用存储过程实现。谢谢
肥龙上天 2009-04-30
  • 打赏
  • 举报
回复

--没说错的话,楼主给的数据错误5262的编号应该是11而不是10
create table #1(ID int,ParentID int)
insert #1 values(1002,0)
insert #1 values(1,1002)
insert #1 values(5262,1002)
insert #1 values(0604,1002)
insert #1 values(3214,1)
insert #1 values(66,1)
insert #1 values(6633,3214)
insert #1 values(4302,3214)
insert #1 values(1004,0604)
insert #1 values(108,0604)
insert #1 values(206,0604)
------------
;with tt
as
(
select ID,ParentID,aa = cast('0000' as varchar(50)) from #1 where ParentID = 0
union all
select b.ID,b.ParentID, cast(a.aa + replicate('0',4-len(b.id))+ rtrim(b.ID) as varchar(50)) from tt a join #1 b on b.ParentID = a.ID
)
select *,rn = row_number() over(order by aa) from tt
/*
ID ParentID aa rn
----------- ----------- -------------------------------------------------- --------------------
1002 0 0000 1
1 1002 00000001 2
66 1 000000010066 3
3214 1 000000013214 4
4302 3214 0000000132144302 5
6633 3214 0000000132146633 6
604 1002 00000604 7
108 604 000006040108 8
206 604 000006040206 9
1004 604 000006041004 10
5262 1002 00005262 11

(11 row(s) affected)
*/
YuanBao20090422 2009-04-30
  • 打赏
  • 举报
回复
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

b.sort+a.ID 不能满足遍历顺序。
YuanBao20090422 2009-04-30
  • 打赏
  • 举报
回复
1002 (1)
|
---------------------------------------
| | |
0001 (2) 5262(10) 0604 (7)
| | |
---------- | -----------
| | | | |
3214 (4) 0066 (3) 1004 (11) 0108 (8) 0206 (9)
|
-----------
| |
6633 (6) 4302 (5)


括号里的数据是遍历的顺序。 先父结点-〉子结点中ID最小的一个结点ID-〉该最小结点子树-〉子结点中第二最小的ID->第二最小的ID子树。

谢谢大家。
csdyyr 2009-04-30
  • 打赏
  • 举报
回复
--测试数据   深度排序     
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT a.*
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
ID PID Name
------ --------- ----------
001 NULL 山东省
002 001 烟台市
004 002 招远市
003 001 青岛市
005 NULL 四会市
006 005 清远市
007 006 小分市
--*/

--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM tb a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
RETURN
END
GO

--调用函数查询002及其所有子节点
SELECT a.*
FROM tb a,f_Cid('002') b
WHERE a.ID=b.ID
/*--结果
ID PID Name
------ ------- ----------
002 001 烟台市
004 002 招远市
--*/



--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/


27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧