CTE真正的递归?

Glo*_*ups 0 t-sql recursion common-table-expression

我刚刚在今天下午发现CTE并在2小时内享受它们后,我意识到他们并没有像我们用其他任何语言学到的那样进行常见的递归.

我的意思是,我总是看到像树搜索一样的递归.所以我期待CTE一直到它发现的第一片叶子,但没有.他分层工作.它从头部开始,然后是所有分支,然后是所有子分支等等......然后是叶子.

有没有办法让它以不同的方式进行搜索?也许我错过了一些东西......我在SQL Server 2005上工作(非,我无法改变2008年)

为了清楚起见,我不想要:

  1. TEAM1
  2. TEAM2
  3. team3
  4. team1-1
  5. team3-1
  6. team1-2

  1. TEAM1
  2. team1-1
  3. team1-2
  4. TEAM2
  5. team3
  6. team3-1

谢谢

Mik*_*son 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
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)