select * from tablename order by MenuID

解决方案 »

  1.   

    如果你的MenuID是整数类型的化,使用下面的:select * from tablename order by cast(MenuID as varchar(10))
      

  2.   

    select * from tablename order by case when ParentID is null then 1 else 0 end ,MenuID
      

  3.   

    --生成数据
    reate table #t(MenuID int,ParentID int,MenuName varchar(40))
    insert into #t select 1  ,NULL,rtrim('数据库      ')
    insert into #t select 2  ,NULL,rtrim('程序设计    ')
    insert into #t select 3  ,NULL,rtrim('网络技术    ')
    insert into #t select 11 ,1   ,rtrim('MS Server   ')
    insert into #t select 12 ,1   ,rtrim('DB2         ')
    insert into #t select 13 ,1   ,rtrim('Oracle      ')
    insert into #t select 14 ,3   ,rtrim('TCP/IP      ')
    insert into #t select 15 ,3   ,rtrim('OSI         ')
    insert into #t select 111,11  ,rtrim('MS Server书1')
    insert into #t select 112,11  ,rtrim('MS Server书2')
    insert into #t select 113,13  ,rtrim('Oracle书1   ')
    insert into #t select 114,15  ,rtrim('OSI书1      ')
    insert into #t select 115,15  ,rtrim('OSI书2      ')
    --执行查询
    SELECT 
        a.*
    FROM 
        #t a
    LEFT JOIN 
        #t b 
    ON 
        a.ParentID=b.MenuID
    ORDER BY 
        CASE 
            WHEN a.ParentID IS NULL THEN a.MenuID
            WHEN b.ParentID IS NULL THEN a.ParentID
            WHEN EXISTS(SELECT 1 FROM #t WHERE MenuID=b.ParentID AND ParentID IS NOT NULL) THEN (SELECT ParentID FROM #t WHERE MenuID=b.ParentID)
            ELSE b.ParentID END,
        CASE 
            WHEN b.ParentID is null THEN a.MenuID
            ELSE a.ParentID END,
        a.MenuID
    --输出结果
    MenuID  ParentID  MenuName
    ------  --------  ------------
    1       NULL      数据库
    11      1         MS Server
    111     11        MS Server书1
    112     11        MS Server书2
    12      1         DB2
    13      1         Oracle
    113     13        Oracle书1
    2       NULL      程序设计
    3       NULL      网络技术
    14      3         TCP/IP
    15      3         OSI
    114     15        OSI书1
    115     15        OSI书2
      

  4.   

    谢谢libin_ftsafe(子陌红尘),但我觉得没有必要新建表,好像直接在原表上操作就可以。本题是不能在MenuID上来排序,它是一个递归问题!
      

  5.   

    昨天白天看到,觉得就是就是哈夫曼树的编码,如果用c,类似要用指针数组来递归索引对每个节点编码,昨天晚上想了很久,都没有想到一个比较好的循环方法实现,signin'  libin_ftsafe(子陌红尘)的方法,的确厉害,不过其中原理,目前没有捉摸透,或许其中也有递归的思想,我昨晚把所有的数据组成一个B树,想如果每个节点按照结果的先后可以有一个编码,那么不就是顺序也出来了~我觉得思路是对的,不过目前还没有想出来:-(  ,关注中~