在此讲解树排序:
测试数据表,设为A表:

ID 项目编号
PID 父类ID
Name 项目名称
这里模拟单编号法对树排序:
先模拟单编号表,设为B表,声明如下:
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
注意:
level 树的深度
sort 最终的排序依据
基本原理:
首先把树的最底端数据插入到B表
然后联合A表,联立得条件是:A.ID=B.PID
通过这个方法显然我们只能得到两级数据,此时我们使用循环
while, 这时用到@@ROWCOUNT=0(执行sql所影响的行数)退出循环
注意:每次循环时只需要读取B表中深度最大的值即在where 限制条件时要加上句:@Level-1=Level
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
结果:
查找指定子节点:
上例其实是查找指定子节点的特殊情况即父节点为null的极端,只要把上述的PID为null 改为相应的要查找节点ID即可
具体方法请参考上述事例
查找指定父节点:
这个运算中主要是模拟编号表要新加入PID字段,另外在条件查询时注意,B.PID=A.ID 请见代码:
declare @t_ table (id char(3),level int,pid char(3),sort varchar(8000))
declare @lev int
set @lev=0
insert @t_ select a.id,@lev,a.pid,a.pid from @t a where a.id='007'
while @@rowcount>0
begin
set @lev=@lev+1
insert @t_ select b.id,@lev,b.pid,a.sort+b.id from @t_ a,@t b where a.pid=b.id and level=@lev-1
end
select a.*,b.name from @t_ a left join @t b on a.id = b.id order by sort desc
结果:
删除所有节点:
其实也就是对模拟编号表的delete操作 略去