zoukankan      html  css  js  c++  java
  • 典型树型菜单问题解决

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

    */

  • 相关阅读:
    设计模式01之 简单工厂模式(创建模式)
    UML系列05之 基本流程图
    UML系列04之 UML时序图
    UML系列03之 UML类图(二)
    UML系列02之 UML类图(一)
    LaTex in Markdown
    Ubuntu18.04 下的Gif录制工具
    Python3 与 C# 扩展之~基础衍生
    Python3 与 C# 扩展之~模块专栏
    Python3 与 C# 面向对象之~异常相关
  • 原文地址:https://www.cnblogs.com/Gaojier/p/2783586.html
Copyright © 2011-2022 走看看