0

今日の午後、CTE を発見し、2 時間楽しんだ後、他の言語で学んだような一般的な再帰を実行していないことに気付きました。

私が言いたいのは、私は常に再帰を木探索のように見ているということです。だから私はCTEが見つけた最初の葉までずっと下がると思っていましたが、そうではありません。彼はレイヤーで作業します。それは頭から始まり、次にすべての枝、次にすべてのサブブランチなど...そして葉です。

別の方法で検索する方法はありますか?おそらく私は何かを見逃していました...私はSQL Server 2005で作業しています(非、2008では変更できません)

明確にするために、私はしたくない:

  1. チーム1
  2. チーム2
  3. チーム3
  4. チーム1-1
  5. チーム3-1
  6. チーム1-2

しかし

  1. チーム1
  2. チーム1-1
  3. チーム1-2
  4. チーム2
  5. チーム3
  6. チーム3-1

ありがとう

4

1 に答える 1

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
于 2012-07-24T18:50:27.550 に答える