我有一个数据集,其中有一个行数列表,每列都有一个ID
,显示order
和一个可为空的parentID
。如果他们有一个,我需要将他们按递增的显示顺序归还给父母。我不知道如何去做这件事。我正在考虑尝试一些工会,但他们需要一些不受限制的工会。按显示顺序和父代号排序
ID order parentID
4 1
6 2
5 1 6
1 2 6
7 3 6
77 3
89 1 77
43 4
23 5
2 1 23
3 2 23
我有一个数据集,其中有一个行数列表,每列都有一个ID
,显示order
和一个可为空的parentID
。如果他们有一个,我需要将他们按递增的显示顺序归还给父母。我不知道如何去做这件事。我正在考虑尝试一些工会,但他们需要一些不受限制的工会。按显示顺序和父代号排序
ID order parentID
4 1
6 2
5 1 6
1 2 6
7 3 6
77 3
89 1 77
43 4
23 5
2 1 23
3 2 23
你必须构建占级别之间的排序,以及每个级别中的排序排序机制。我会告诉你如何使用递归CTE来做到这一点。
首先,您需要确定可以比较多少个元素。在你的表格中,答案是5,但这可能是任意的。因此,我们将查询首先
declare @dyn_ord as int = (select len(MAX(ordering)) from #A)
这得到的数字的数量,在这种情况下就是这里,我使用“#A”作为你的表的名称。
接下来,我们建立了递归CTE与领域,我们希望
declare @dyn_ord as int = (select len(MAX(ordering)) from #A)
; with
Parent as (
-- Anchor member definition
select a.Id -- of course show the ID
, a.parentID -- show the parent's ID
, cast(a.ID as varchar(max)) as Path -- this is bonus to help understand recursion
, CAST((REPLACE(STR(ordering,@dyn_ord),' ','0')) AS nvarchar(max)) AS OrderString -- our modified ordering, explanation to follow
from #A a
where a.parentId is null
union all
-- Recursive member definition
select c.Id
, c.parentID
, cast(Path + ' -> ' + cast(c.ID as varchar(max)) as varchar(max)) as Path
, (p.OrderString + '.' + CAST((REPLACE(STR(c.ordering,@dyn_ord),' ','0')) AS nvarchar(max))) AS OrderString
from #A as c
inner join Parent as p
on c.parentID = p.ID
)
SELECT Id
, parentID
, Path
, OrderString
FROM Parent
order by OrderString asc
OrderString是我们用来秩序的机制。在给定的级别中,它(1)采用排序,(2)将其转换为字符串,并且(3)根据需要填充任何额外的零。如果你想比较像1和10这样的排序,需要第三步,这并不总是给你想要的字符串比较。 (2)添加一个句点(不需要但有助于理解排序),(3)然后执行相同的操作如前段所述的三个步骤。
只要把所有你想要在你的ORDER BY
子句来排序的列:
select parentID, ordering, ID
from mytab
order by parentID, ordering
(我已经改名为order
订购,因为order
是一个SQL关键字)
UPDATE
要将NULL parentID移动到底部,可以使用NULLS LAST
如果您的RDBMS支持它:
select parentID, ordering, ID
from mytab
order by parentID nulls last, ordering
这样做只是把所有的行都放在最上面的空父母上,而所有的父母都放在最下面的一个非空父母 –
@DanWier在你的问题中,你没有提到你想要的NULL值。无论如何,请参阅我的更新答案,了解可能有效的方法(如果这样做不起作用,则应编辑您的问题并使用适当的RDBMS标记以获得更具体的答案)。 –
圣洁的废话。我有很多需要学习的东西,非常感谢! –
不客气:)为了更好地感受一下发生了什么,玩一下这一点。 – KindaTechy