问题描述: 实现对商品信息的分类,分类的同时生成一个序号。 序号的规则就是取他所属的类的序号+同一类别的排序号) 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上百实例源码以及开源项目