2012-07-24 138 views
1

我剛剛在下午發現了CTE,在2個小時內享用CTE後,我意識到他們沒有執行像我們所有其他語言學到的常見遞歸。與CTE真正的遞歸?

我的意思是,我總是看到像樹搜索遞歸。所以我期待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

感謝

+4

的'ORDER BY'條款浮現在腦海。除非您指定它,否則CTE不會改變您沒有*保證*任何特定順序的事實。 – 2012-07-24 17:49:16

回答

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 
+0

感謝您的提示。我明天會檢查一下。 – Gloups 2012-07-24 18:57:51

+0

完美,這很好,謝謝你的快速幫助;) – Gloups 2012-07-26 09:25:28

+0

不客氣。 – 2012-07-26 09:25:42