表 ButtonList
ID ButtonName ParentID
1  基础设置    null
2  卡务管理    null
3  消费管理    null
4  卡类型设置   1
5  新增         4
6  修改         4
7  删除         4
8  保存         4
9  发卡管理     2
..............想得到结果:
1  基础设置    null
4  卡类型设置   1
5  新增         4
6  修改         4
7  删除         4
8  保存         4
2  卡务管理    null
9  发卡管理     2 
3  消费管理    null

解决方案 »

  1.   

    declare @t table(ID int,ButtonName varchar(10),ParentID int)
    insert into @t select 1  ,'基础设置'   , null
    union all select 2  ,'卡务管理'   , null
    union all select 3  ,'消费管理'   , null
    union all select 4  ,'卡类型设置' ,  1
    union all select 5  ,'新增'       ,  4
    union all select 6  ,'修改'       ,  4
    union all select 7  ,'删除'       ,  4
    union all select 8  ,'保存'       ,  4
    union all select 9  ,'发卡管理'   ,  2select * from @t order by case right(ButtonName,2) when '设置' then '0' when '管理' then '2' else '1' end,ID
      

  2.   

    ParentID
    为父ID我要的结果是只要这条记录有CHILD就先排CHILD记录再按ID排序
      

  3.   

    没规则不知道你想干什么ORDER BY NULLIF(ButtonName,'基础设置'),NULLIF(ButtonName,'卡类型设置'),NULLIF(....
    自己想怎么排,按顺序一个个加上去
      

  4.   

    xeqtr1982(Visual C# .NET) ( ) 信誉:100 
    ==
    是不能够按名称来的.
      

  5.   

    ParentID
    为父ID我要的结果是只要这条记录有CHILD就先排CHILD记录再按ID排序
    ===========
    这个就是规则啊
      

  6.   

    哦 没注意到有个ParentID借用楼上的数据表 
    select * from @T order by case when ParentID is null then cast(id as varchar(10)) else cast(ParentID as varchar(10)) + cast(id as varchar(10)) end
      

  7.   

    ParentID深度不确定,gohst001的写法有问题
      

  8.   

    gohst001(很多年来一直想知道昵称到底能多长~~~~~~~~~~~~~~~~~~) 
    ==
    还是不对.我总共有三层父子关系
      

  9.   

    --寫個函數得到最上層的ParentID
    Create Table TEST( ID Int,ButtonName Nvarchar(10),ParentID Int)
    Insert Into TEST Select 1  ,N'基础设置'   , null
    Union All Select 2  ,N'卡务管理'   , null
    Union All Select 3  ,N'消费管理'   , null
    Union All Select 4  ,N'卡类型设置' ,  1
    Union All Select 5  ,N'新增'       ,  4
    Union All Select 6  ,N'修改'       ,  4
    Union All Select 7  ,N'删除'       ,  4
    Union All Select 8  ,N'保存'       ,  4
    Union All Select 9  ,N'发卡管理'   ,  2
    GO
    Create Function GetParentID(@ID Int)
    Returns Int
    As
    Begin
    Declare @ParentID Int
    Select @ParentID=@ID
    While Exists(Select 1 From TEST Where ID=@ParentID And ParentID Is Not Null)
    Select @ParentID=ParentID From TEST Where ID=@ParentID  And ParentID Is Not Null
    Return @ParentID
    End
    GO
    Select * From  TEST Order By dbo.GetParentID(ID),ID
    GO
    Drop Table TEST
    Drop Function GetParentID
    /*
    ID ButtonName ParentID
    1 基础设置 NULL
    4 卡类型设置 1
    5 新增 4
    6 修改 4
    7 删除 4
    8 保存 4
    2 卡务管理 NULL
    9 发卡管理 2
    3 消费管理 NULL
    */
      

  10.   

    paoluo(一天到晚游泳的鱼) ( ) 信誉:100 
    ===
    谢谢..下午结贴..
      

  11.   

    declare @t table(ID int,ButtonName varchar(10),ParentID int)
    insert into @t select 1  ,'基础设置'   , null
    union all select 2  ,'卡务管理'   , null
    union all select 3  ,'消费管理'   , null
    union all select 4  ,'卡类型设置' ,  1
    union all select 5  ,'新增'       ,  4
    union all select 6  ,'修改'       ,  4
    union all select 7  ,'删除'       ,  4
    union all select 8  ,'保存'       ,  4
    union all select 9  ,'发卡管理'   ,  2批语句的写法
    DECLARE @tmp TABLE(ID int,ButtonName varchar(10),NewP int)
    INSERT @tmp SELECT ID,ButtonName,ISNULL(ParentID,ID) NewP FROM @t
    SELECT ID,ButtonName,NewP,
    CASE ISNULL(NULLIF(ID,NewP),0)
    WHEN 0 THEN ID 
    ELSE
    CASE ISNULL(NULLIF((SELECT COUNT(*) FROM @tmp c WHERE c.ID=c.NewP AND c.ID=b.NewP),0),0)
    WHEN 0 THEN (SELECT a.NewP FROM @tmp a WHERE a.ID=b.NewP)
    ELSE b.NewP
    END 
    END AS RootID
    FROM  @tmp b ORDER BY RootID,NewP下面是一条查询实现declare @t table(ID int,ButtonName varchar(10),ParentID int)
    insert into @t select 1  ,'基础设置'   , null
    union all select 2  ,'卡务管理'   , null
    union all select 3  ,'消费管理'   , null
    union all select 4  ,'卡类型设置' ,  1
    union all select 5  ,'新增'       ,  4
    union all select 6  ,'修改'       ,  4
    union all select 7  ,'删除'       ,  4
    union all select 8  ,'保存'       ,  4
    union all select 9  ,'发卡管理'   ,  2SELECT ID,ButtonName,NewP,
    CASE ISNULL(NULLIF(ID,NewP),0)
    WHEN 0 THEN ID 
    ELSE
    CASE ISNULL(NULLIF((SELECT COUNT(*) FROM 
    (SELECTID,ButtonName,ISNULL(ParentID,ID) NewP FROM @t) c WHERE c.ID=c.NewP AND c.ID=b.NewP),0),0)
    WHEN 0 THEN (SELECT a.NewP FROM 
    (SELECTID,ButtonName,ISNULL(ParentID,ID) NewP FROM @t) a WHERE a.ID=b.NewP)
    ELSE b.NewP
    END 
    END AS RootID
    FROM  (SELECTID,ButtonName,ISNULL(ParentID,ID) NewP FROM @t) b ORDER BY RootID,NewP这里只是将上面用的临时表变量全部带了进来.
      

  12.   

    结果.id     name            parentid rootid
    1 基础设置 1 1
    4 卡类型设置 1 1
    5 新增 4 1
    6 修改 4 1
    7 删除 4 1
    8 保存 4 1
    2 卡务管理 2 2
    9 发卡管理 2 2
    3 消费管理 3 3实际上如果再产生一个depth列那就无敌了. 这种写法感觉有点问题的,至于depth列也就是多将我那里面的case when改改再生成一列,就不多写了.
      

  13.   

    fcuandy(电脑杂工)的語句深度是固定的,不利於擴展。加上一調數據union all select 10  ,'AA'       ,  8得到的結果就不對了
      

  14.   

    我是针对于楼主所说的只有三级才这样写的. 如果不定,肯定要用循环的.
    只有最深级别确定才使能用这种写法,多产生列,多嵌套几层CASE WHEN
      

  15.   

    --如果固定只有3層,這麼寫即可
    Create Table TEST( ID Int,ButtonName Nvarchar(10),ParentID Int)
    Insert Into TEST Select 1  ,N'基础设置'   , null
    Union All Select 2  ,N'卡务管理'   , null
    Union All Select 3  ,N'消费管理'   , null
    Union All Select 4  ,N'卡类型设置' ,  1
    Union All Select 5  ,N'新增'       ,  4
    Union All Select 6  ,N'修改'       ,  4
    Union All Select 7  ,N'删除'       ,  4
    Union All Select 8  ,N'保存'       ,  4
    Union All Select 9  ,N'发卡管理'   ,  2
    GO
    Select *From TEST A  Order By IsNull((Select IsNull(ParentID,ID) From TEST Where ID=(Select IsNull(ParentID,ID) From TEST Where ID=A.ID)),ID),ID
    GO
    Drop Table TEST
    /*
    ID ButtonName ParentID
    1 基础设置 NULL
    4 卡类型设置 1
    5 新增 4
    6 修改 4
    7 删除 4
    8 保存 4
    2 卡务管理 NULL
    9 发卡管理 2
    3 消费管理 NULL
    */
      

  16.   

    鱼你上面的写法,只是针对在写数据时上一级数据先入库,下级数据后入库.几年前我写论坛时遇到过.BID  Bname FarID
    1    a     1
    2    a1    1
    3    a2    1
    4    b     4
    对于顺序插入的数据,这样写完全没有问题.但当我进行过操作之后, 将论坛版块 a1 移为b的子版,此时a1的记录数据为
    2 a1 4
    这样写就有问题了,你可以试下把你的测试数据改成Create Table TEST( ID Int,ButtonName Nvarchar(10),ParentID Int)
    Insert Into TEST Select 4  ,N'基础设置'   , null
    Union All Select 2  ,N'卡务管理'   , null
    Union All Select 3  ,N'消费管理'   , null
    Union All Select 1  ,N'卡类型设置' ,  4
    Union All Select 5  ,N'新增'       ,  4
    Union All Select 6  ,N'修改'       ,  4
    Union All Select 7  ,N'删除'       ,  4
    Union All Select 8  ,N'保存'       ,  4
    Union All Select 9  ,N'发卡管理'   ,  2
      

  17.   

    我知道有问题.
    "实际上如果再产生一个depth列那就无敌了. 这种写法感觉有点问题的,至于depth列也就是多将我那里面的case when改改再生成一列,就不多写了."
    这里我已经写过了.hehe.
    利用我那个二层嵌套的case when可以产生一个深度列,我是打着烦,所以没写了.