典型树型菜单问题解决

mac2022-06-30  19

问题描述: 实现对商品信息的分类,分类的同时生成一个序号。 序号的规则就是取他所属的类的序号+同一类别的排序号) scb_subject classid   classname fatherid  scblevel 1          蔬菜      -1          01 2          茄子       1          0101 3          白菜       1          0102 4          萝卜       1          0103 5          布匹      -1          02 6          服装       5          0201 7          女装       6          020101 8          女上衣     7          02010101 9          男装       6          020102 如果现在表里面的scblevel都是空的。

解决方案:

–测试数据

程序代码 Create TABLE t(classid varchar(3),fatherid varchar(3),classname nvarchar(10),scblevel varchar(20)) Insert t Select ‘1′,’-1′ ,’蔬菜’,null UNION ALL Select ‘2′,’1′  ,’茄子’,null UNION ALL Select ‘3′,’1′  ,’白菜’,null UNION ALL Select ‘4′,’1′  ,’萝卜’,null UNION ALL Select ‘5′,’-1′ ,’布匹’,null UNION ALL Select ‘6′,’5′  ,’服装’,null UNION ALL Select ‘7′,’6′  ,’女装’,null UNION ALL Select ‘8′,’7′  ,’女上衣’,null UNION ALL Select ‘9′,’6′  ,’男装’,null

–深度排序显示处理 –生成每个节点的编码累计(相同当单编号法的编码) DECLARE @t_Level TABLE(classid varchar(3),Level int,Sort varchar(8000)) DECLARE @Level int SET @Level=0 Insert @t_Level Select classid,@Level,’0′+classid FROM t Where fatherid = -1 WHILE @@ROWCOUNT>0 BEGIN SET @Level=@Level+1 Insert @t_Level Select a.classid,@Level,b.Sort+’0′+a.classid FROM t a,@t_Level b Where a.fatherid=b.classid AND b.Level=@Level-1 END

—先更新原表的scblevel编号 update t set scblevel=A.Sort from T inner join ( Select top 100 PERCENT a.classid,b.Sort,a.classname FROM t a,@t_Level b Where a.classid=b.classid orDER BY b.Sort) A on T.classid=A.classid

—重新排列scblevel编号 Update T SET scblevel=’0′+RIGHT(–重排第一层编码 (Select COUNT(DISTINCT scblevel) FROM T Where scblevel<=a.scblevel AND LEN(scblevel)=2),2) +CASE –重排第二层编码 WHEN LEN(scblevel)>2 THEN RIGHT(100+ (Select COUNT(DISTINCT scblevel) FROM T Where scblevel<=a.scblevel AND scblevel LIKE LEFT(a.scblevel,2)+’__’),2) ELSE ” END +CASE –重排第三层编码 WHEN LEN(scblevel)>4 THEN RIGHT(100+ (Select COUNT(DISTINCT scblevel) FROM T Where scblevel<=a.scblevel AND scblevel LIKE LEFT(a.scblevel,4)+’__’),2) ELSE ” END +CASE –重排第四层编码 WHEN LEN(scblevel)>6 THEN RIGHT(100+ (Select COUNT(DISTINCT scblevel) FROM T Where scblevel<=a.scblevel AND scblevel LIKE LEFT(a.scblevel,4)+’__’),2) ELSE ” END +CASE –重排第五层编码 WHEN LEN(scblevel)>8 THEN RIGHT(100+ (Select COUNT(DISTINCT scblevel) FROM T Where scblevel<=a.scblevel AND scblevel LIKE LEFT(a.scblevel,4)+’__’),2) ELSE ” END FROM T a

–显示处理结果 Select * FROM T

drop table T

/*

classid fatherid classname  scblevel ——- ——– ———- ——————– 1       -1       蔬菜         01 2       1        茄子         0101 3       1        白菜         0102 4       1        萝卜         0103 5       -1       布匹         02 6       5        服装         0201 7       6        女装         020101 8       7        女上衣       02010101 9       6        男装         020102

(9 row(s) affected)

*/

转载于:https://www.cnblogs.com/Gaojier/archive/2010/04/08/2783586.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)