2016-09-01 94 views
3

我有一個表:如何正確創建遞歸查詢?

ItemID  Level  ItemName    ItemPath 
    0   0   England     England 
    50   1   Hampshire county  England\HampshireCounty 
    401  2   Southampton    England\HampshireCounty\Southampton 
    402  2   Portsmouth    England\HampshireCounty\Portsmouth 

我創建了以下查詢:

ItemID  ParentID    ItemName 
    0   NULL    England 
    50   0     Hampshire county 
    401  50     Southampton 
    402  50     Portsmouth 

我想下面的表格是

WITH tree (A_ItemName, A_ItemId, A_Level, pathstr) 
AS (SELECT ItemName, ItemId, 0, 
     CAST('' AS VARCHAR(MAX)) 
    FROM Items 
    WHERE ParentID IS NULL 
    UNION ALL 
    SELECT ItemName, ItemID, t.A_Level + 1, t.pathstr + '/' + V.ItemName 
    FROM Items V 
     INNER JOIN tree t 
      ON t.A_ItemId = V.ItemID) 
SELECT SPACE(A_Level) + A_ItemName as A_ItemName, A_ItemId, A_Level, pathstr 
FROM tree 
ORDER BY pathstr, A_ItemId 

不過,我有一個錯誤:

The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

任何想法我做錯了?

+0

試着追加'選項(MaxRecursion 0)' –

+1

ON t.A_ItemId = V.ItemID ?? – Serg

+1

關於Gordon Linoff糾正改變'CAST(''AS VARCHAR(MAX))''CAST(ItemName AS VARCHAR(MAX))' – Hamawi

回答

5

您錯過了家長。我認爲這是你想要的:

WITH tree (A_ItemName, A_ItemId, A_Level, pathstr) AS (
     SELECT ItemName, ItemId, 0, CAST(ItemName AS VARCHAR(MAX)) 
     FROM Items 
     WHERE ParentID IS NULL 
     UNION ALL 
     SELECT ItemName, ItemID, t.A_Level + 1, t.pathstr + '/' + V.ItemName 
     FROM Items V INNER JOIN 
      tree t 
      ON t.A_ItemId = V.ParentId 
    ) 
SELECT SPACE(A_Level) + A_ItemName as A_ItemName, A_ItemId, A_Level, pathstr 
FROM tree 
ORDER BY pathstr, A_ItemId 
2

使用下面的腳本包括父標籤('英格蘭')。

WITH tree (A_ItemName, A_ItemId, A_Level, pathstr) AS (
     SELECT ItemName, ItemId, 0, CONVERT(VARCHAR(MAX),ItemName) 
     FROM #t 
     WHERE ParentID IS NULL 
     UNION ALL 
     SELECT ItemName, ItemID, t.A_Level + 1, t.pathstr + '/' + V.ItemName 
     FROM #t V INNER JOIN 
      tree t 
      ON ISNULL(t.A_ItemId,0) = V.ParentId 
    ) 
SELECT SPACE(A_Level) + A_ItemName as A_ItemName, A_ItemId, A_Level, pathstr 
FROM tree 
ORDER BY pathstr, A_ItemId