表 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
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
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
为父ID我要的结果是只要这条记录有CHILD就先排CHILD记录再按ID排序
自己想怎么排,按顺序一个个加上去
==
是不能够按名称来的.
为父ID我要的结果是只要这条记录有CHILD就先排CHILD记录再按ID排序
===========
这个就是规则啊
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
==
还是不对.我总共有三层父子关系
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
*/
===
谢谢..下午结贴..
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这里只是将上面用的临时表变量全部带了进来.
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改改再生成一列,就不多写了.
只有最深级别确定才使能用这种写法,多产生列,多嵌套几层CASE WHEN
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
*/
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
"实际上如果再产生一个depth列那就无敌了. 这种写法感觉有点问题的,至于depth列也就是多将我那里面的case when改改再生成一列,就不多写了."
这里我已经写过了.hehe.
利用我那个二层嵌套的case when可以产生一个深度列,我是打着烦,所以没写了.