2016-09-01 22 views
3

私はテーブルを持っている:私が欲しいもの再帰クエリを正しく作成する方法は?

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

は次の表です:

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 

私は次のクエリ作成しました:

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

'option(MaxRecursion 0) 'を追加してください。 –

+1

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

+1

ゴードン・リノフの修正で '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

親タグ( 'England')を含めるために以下のスクリプトを使用してください。

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 
関連する問題