我今天下午刚刚发现了CTE,在2小时内享受了CTE之后,我意识到他们并没有像我们用其他任何语言学到的那样进行常见的递归。
我的意思是,我总是看到像树搜索一样的递归。所以我期待CTE一直到它发现的第一片叶子,但没有。他分层工作。它从头部开始,然后是所有分支,然后是所有子分支等等......然后是叶子。
有没有办法让它以不同方式进行搜索?也许我错过了一些东西...... 我在SQL Server 2005上工作(非,我不能改变2008年)
为了说清楚,我不想要:
但
由于
答案 0 :(得分:7)
您可以构建一个列,以便在进行递归时进行排序。
这样的事情:
declare @t table
(
ID int,
ParentID int,
Name varchar(10)
);
insert into @T values
(1, null, 'team1'),
(2, null, 'team2'),
(3, null, 'team3'),
(4, 1, 'team1-1'),
(5, 1, 'team1-2'),
(6, 3, 'team3-1');
with C as
(
select T.ID,
T.ParentID,
T.Name,
cast(right(100000 + row_number() over(order by T.ID), 5) as varchar(max)) as Sort
from @T as T
where T.ParentID is null
union all
select T.ID,
T.ParentID,
T.Name,
C.Sort+right(100000 + row_number() over(order by T.ID), 5)
from @T as T
inner join C
on T.ParentID = C.ID
)
select *
from C
order by Sort
结果:
ID ParentID Name Sort
----------- ----------- ---------- ------------
1 NULL team1 00001
4 1 team1-1 0000100001
5 1 team1-2 0000100002
2 NULL team2 00002
3 NULL team3 00003
6 3 team3-1 0000300001