• 典型树型菜单问题解决


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

    */

  • 相关阅读:
    pipelinewise 学习二 创建一个简单的pipeline
    pipelinewise 学习一 docker方式安装
    Supercharging your ETL with Airflow and Singer
    ubuntu中使用 alien安装rpm包
    PipelineWise illustrates the power of Singer
    pipelinewise 基于singer 指南的的数据pipeline 工具
    关于singer elt 的几篇很不错的文章
    npkill 一个方便的npm 包清理工具
    kuma docker-compose 环境试用
    kuma 学习四 策略
  • 原文地址:https://www.cnblogs.com/Gaojier/p/2783586.html
Copyright © 2020-2023  润新知