没有行号的序列

时间:2019-08-21 13:17:42

标签: sql-server sql-server-2016

我有以下数据集

Create table #table(
Message varchar(10),
ID varchar(5),
ParentID varchar(5))


Insert into #table 
select 'Parent','123',''
UNION
select 'Child','234','123'
UNION
select 'Child','345','123'
UNION
select 'Child','145','123'
UNION
select 'Parent','333',''
UNION
select 'Child','567','333'
UNION
select 'Child','789','333'
UNION
select 'Child','100','333'
UNION
select 'Child','111','333'

select * from #table

当我选择数据时,数据看起来是随机的。但我想按以下顺序

Message    ID      ParentID
Parent     123     
Child      234     123
Child      345     123
Child      145     123 
Parent     333     
Child      567     333
Child      789     333
Child      100     333 
Child      111     333 

我尝试使用行号,但对于以下序列它不起作用。 有人可以帮帮我吗 ?

3 个答案:

答案 0 :(得分:1)

CASE中使用ORDER BY语句,以下查询应执行您想要的操作:

select * from #table
order by case when Message = 'Parent' then ID else ParentID end, ParentID

答案 1 :(得分:0)

使用此:

select message,id,parentid
from  #table
order by case when parentid = '' then convert(int,id)-1 else parentid end

此解决方案不基于消息列,并且将对所有数据集进行纠正。

答案 2 :(得分:0)

使用条件排序:

select * from #table
order by case when parentid = '' then id else parentid end, parentid

请参见demo
结果:

> Message | ID  | ParentID
> :------ | :-- | :-------
> Parent  | 123 |         
> Child   | 145 | 123     
> Child   | 234 | 123     
> Child   | 345 | 123     
> Parent  | 333 |         
> Child   | 100 | 333     
> Child   | 111 | 333     
> Child   | 567 | 333     
> Child   | 789 | 333  

如果父母在NULL列中包含parentid而不是'',则必须将ORDER BY子句更改为:

order by isnull(parentid, id), parentid