我的想法是用,case when then else end来做到,但是我还是没有找到有效的方法,请教各位了
7 个解决方案
#1
use Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T(ID int,ParentID int)
Insert #T
select 1,0 union all
SELECT 2,1 union all
select 3,2 UNION ALL
SELECT 4,0 UNION ALL
SELECT 5,4
Go
;WITH a
as
(
SELECT *,ord=CAST(right(1000+ID,3) AS NVARCHAR(200)) FROM #T WHERE ParentID=0
UNION ALL
SELECT b.*,ord=CAST(a.ord+right(1000+b.ID,3) AS NVARCHAR(200)) FROM #T AS b INNER JOIN a ON a.ID=b.ParentID
)
SELECT ID,ParentID
FROM a
ORDER BY ord
/*
ID ParentID
1 0
2 1
3 2
4 0
5 4
*/
#2
没有明白意思 。
#3
来学习学习
#4
简单说就是:数据读出来的本身排序规则太简单,我需要层叠式的排序,这么说吧,这个帖子里面,我回复你的,那么我的帖子的数据记录下来你的帖子的id,然后又有人回复我,我需要这几个帖子成为一组数据,排序1,2,3,以此类推。如果有几个回复我的,那么他们的新排序号都是3,这些再按照时间排序。
这个排序方式是经过一个判断查找后得到的新排序规则。
这个排序方式是经过一个判断查找后得到的新排序规则。
#5
把各级id转为字符串后,前面加零,凑足到最大可能的ID长度,用递归找出各级此经过处理的id,拼接成一个字符串,以这个字符串排序.
#6
比如,表中最大的ID如为5位,则用来排序的各级不同的ID可能如:
00001
000250000300125
0010000025
#7
实在抱歉,1楼给出的答案是正确和最切题的,可惜我结贴的时候没弄明白,对不起了
#1
use Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T(ID int,ParentID int)
Insert #T
select 1,0 union all
SELECT 2,1 union all
select 3,2 UNION ALL
SELECT 4,0 UNION ALL
SELECT 5,4
Go
;WITH a
as
(
SELECT *,ord=CAST(right(1000+ID,3) AS NVARCHAR(200)) FROM #T WHERE ParentID=0
UNION ALL
SELECT b.*,ord=CAST(a.ord+right(1000+b.ID,3) AS NVARCHAR(200)) FROM #T AS b INNER JOIN a ON a.ID=b.ParentID
)
SELECT ID,ParentID
FROM a
ORDER BY ord
/*
ID ParentID
1 0
2 1
3 2
4 0
5 4
*/
#2
没有明白意思 。
#3
来学习学习
#4
简单说就是:数据读出来的本身排序规则太简单,我需要层叠式的排序,这么说吧,这个帖子里面,我回复你的,那么我的帖子的数据记录下来你的帖子的id,然后又有人回复我,我需要这几个帖子成为一组数据,排序1,2,3,以此类推。如果有几个回复我的,那么他们的新排序号都是3,这些再按照时间排序。
这个排序方式是经过一个判断查找后得到的新排序规则。
这个排序方式是经过一个判断查找后得到的新排序规则。
#5
把各级id转为字符串后,前面加零,凑足到最大可能的ID长度,用递归找出各级此经过处理的id,拼接成一个字符串,以这个字符串排序.
#6
比如,表中最大的ID如为5位,则用来排序的各级不同的ID可能如:
00001
000250000300125
0010000025
#7
实在抱歉,1楼给出的答案是正确和最切题的,可惜我结贴的时候没弄明白,对不起了