zoukankan      html  css  js  c++  java
  • 在论坛中出现的比较难的sql问题:8(递归问题 树形结构分组)

    最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

    所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。 

    sql2008 树形结构分组
    http://bbs.csdn.net/topics/390634930


    ID DeprtID DeprtName 

    1   0        1        
    2   1        2
    3   1        3
    4   2        4
    5   3        5
    6   4        6
    7   5        7

    分组后效果
    ID DeprtID DeprtName 
    1   0        1        
    2   1        2
    4   2        4
    6   4        6
    3   1        3
    5   3        5
    7   5        7

     

    我的解法:

     

    --drop table tb
    
    create table tb(ID int, DeprtID int, DeprtName varchar(10))
    
    insert into tb
    select 1,   0,        '1'        
    union all select 2 ,  1 ,       '2'
    union all select 3 ,  1 ,       '3'
    union all select 4 ,  2 ,       '4'
    union all select 5 ,  3 ,       '5'
    union all select 6 ,  4 ,       '6'
    union all select 7 ,  5,        '7'
    go
    
    
    ;with t
    as
    (
    select id,DeprtID,DeprtName,1 as level,
           cast(right('000'+cast(id as varchar),3) as varchar(max)) as sort
    from tb
    where DeprtID =0
    
    union all
    
    select tb.id,tb.DeprtID,tb.DeprtName,level + 1 ,
           cast(sort+right('000'+cast(tb.id as varchar),3) as varchar(max))
    from t
    inner join tb 
            on t.id = tb.DeprtID
    )
    
    select id,deprtid,deprtname
    from t
    order by sort
    /*
    id	deprtid	deprtname
    1	0	    1
    2	1	    2
    4	2	    4
    6	4	    6
    3	1	    3
    5	3	    5
    7	5	    7
    */
    

    这里还有个例子,就是递归查询后,按照树形来排序:

     

    drop table tb
    
    create table tb
    (
    id int,
    pid int,
    name varchar(20)
    )
    
    insert into tb
    select 1,null,'x' 
    union all select 2,1,'a'
    union all select 3,1,'b'
    union all select 4,2,'aa'
    union all select 5,3,'bb'
    go
    
    
    ;with t
    as
    (
    select id,pid,name,1 as level,
           cast(right('000'+cast(id as varchar),3) as varchar(max)) as sort
    from tb
    where pid is null
    
    union all
    
    select tb.id,tb.pid,tb.name,level + 1 ,
           cast(sort+right('000'+cast(tb.id as varchar),3) as varchar(max))
    from t
    inner join tb 
            on t.id = tb.pid
    )
    
    select *
    from t
    order by sort
    /*
    id	pid	name	level	sort
    1	NULL	x	1	001
    2	1	a	2	001002
    4	2	aa	3	001002004
    3	1	b	2	001003
    5	3	bb	3	001003005
    */
    


  • 相关阅读:
    网易云易盾牵手百视通 助力广电领域新媒体内容安全
    理解DDoS防护本质:基于资源较量和规则过滤的智能化系统
    DDoS防护之TCP防护
    2017年内容安全十大事件盘点
    知物由学 | AI时代,那些黑客正在如何打磨他们的“利器”?(一)
    应对羊毛党的老手段不管用了,但有些公司依然有办法,他们是怎么做的?
    知物由学 | 未来安全隐患:AI的软肋——故意欺骗神经网络
    MYSQL数据库的数据完整性
    MYSQL是什么?
    python多线程实现多任务
  • 原文地址:https://www.cnblogs.com/momogua/p/8304551.html
Copyright © 2011-2022 走看看