SQL系列关于树

在此讲解树排序:

测试数据表,设为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操作 略去

请使用浏览器的分享功能分享到微信等