按两栏排序

时间:2017-05-11 08:15:11

标签: sql-server sql-server-2008

我有一张桌子如下。

enter image description here

我需要结果如下图所示。

enter image description here

我需要ID和dependencyFK列的记录顺序。 例如,第一行ID = 1,因此第二个记录带有1个依赖性.Fk然后再次检查ID值,然后检查依赖性值。

1 个答案:

答案 0 :(得分:2)

您可以使用递归CTE构建完整层次结构的表示,然后使用内置的hierarchyid类型,该类型知道如何正确排序层次结构:

declare @t table (ID int not null, controlName varchar(17) not null, dependencyFK int null)
insert into @t(ID,controlName,dependencyFK) values
(1 ,'One'   ,null),
(2 ,'Two'   ,1),
(3 ,'Three' ,2),
(4 ,'Four'  ,2),
(5 ,'Five'  ,null),
(6 ,'Six'   ,1),
(7 ,'Seven' ,5),
(8 ,'Eight' ,null),
(9 ,'Nine'  ,5),
(10,'Ten'   ,null)

;With BuiltHierarchy as (
    select *,'/' + CONVERT(varchar(max),ID) + '/' as Hier
    from @t
    union all
    select bh.ID, bh.controlName, o.dependencyFK,'/' + CONVERT(varchar(max),o.ID) + Hier as Hier
    from BuiltHierarchy bh
    inner join
    @t o on bh.dependencyFK = o.ID
)
select *
from BuiltHierarchy
where dependencyFK is null
order by CONVERT(hierarchyid,Hier)

同时,您可能希望考虑直接在建模层次结构时切换到实际使用此类型,而不是使用现有的"子点在父级"表示,不太适合执行分层数据的一般处理。

结果:

ID          controlName       dependencyFK Hier
----------- ----------------- ------------ -----
1           One               NULL         /1/
2           Two               NULL         /1/2/
3           Three             NULL         /1/2/3/
4           Four              NULL         /1/2/4/
6           Six               NULL         /1/6/
5           Five              NULL         /5/
7           Seven             NULL         /5/7/
9           Nine              NULL         /5/9/
8           Eight             NULL         /8/
10          Ten               NULL         /10/