2011-12-15 61 views
-1

我正在嘗試獲取此查詢的層次結構級別。這裏是CTE遞歸查詢如何獲取此查詢的層次結構級別

WITH CategoryRec AS 
(
    SELECT Id, Parentid, Name 
    FROM dbo.Category 

    UNION ALL 

    SELECT cr.Id, c.Parentid, cr.Name 
    FROM CategoryRec AS cr INNER JOIN dbo.Category AS c ON cr.Parentid = c.Id 
    WHERE c.Parentid IS NOT NULL 
) 
SELECT DISTINCT Id, Parentid, Name 
FROM CategoryRec 

這個問題是與此相關的問題在這裏:How to get the full Hierarchy with SQL CTE

感謝您的幫助

回答

2

您需要添加一列名爲Level(或任何你想調用它) - 既「錨」選擇以及你的CTE的遞歸部分 - 像這樣:

WITH CategoryRec AS 
(
    SELECT Id, Parentid, Name, 1 AS 'Level' 
    FROM dbo.Category 

    UNION ALL 

    SELECT cr.Id, c.Parentid, cr.Name, cr.Level + 1 
    FROM CategoryRec AS cr 
    INNER JOIN dbo.Category AS c ON cr.Parentid = c.Id 
    WHERE c.Parentid IS NOT NULL 
) 
SELECT DISTINCT Id, Parentid, Name, Level 
FROM CategoryRec 
+0

其實這一個沒有工作。它返回了不正確的水平 – Luke101

+0

定義*不正確* ... –

+0

我已經創建了一個測試類別層次結構和級別,而不是我所期望的。例如,一個特定的ID會爲不同的父母顯示幾個級別。無論父母是什麼水平,都應始終保持不變。 – Luke101

2

你需要選擇第一個查詢中級別爲marc_s的層次結構的頂層。

;WITH CategoryRec AS 
(
    SELECT a.Id, 
     a.Parentid, 
     a.Name, 
     1 AS 'Level' 
    FROM dbo.Category as a 
    WHERE a.Parentid IS NULL 

    UNION ALL 

    SELECT b.Id, 
     b.Parentid, 
     b.Name, 
     a.Level + 1 
    FROM CategoryRec as a 
      INNER JOIN 
     dbo.Category as b on b.Parentid = a.Id 
    WHERE b.Parentid IS NOT NULL 
) 
SELECT Id, Parentid, Name, Level 
FROM CategoryRec 
0

這將返回正確的級別。但不知道這個查詢性能是否應該是

WITH CategoryRec AS 
(
    SELECT  Id, Parentid, Name, 1 as [Level] 
    FROM dbo.Category 
    where Parentid IS NULL 

    UNION ALL 

    SELECT c.Id, c.Parentid, c.Name, (cr.[Level] + 1) as [Level] 
    FROM Category c INNER JOIN 
    CategoryRec AS cr ON c.Parentid = cr.Id 
), 
CategoryRec2 as 
(
    SELECT Id, Parentid, Name, [Level] 
    FROM CategoryRec 

    UNION ALL 

    SELECT cr.Id, c.Parentid, cr.Name, cr.[Level] 
    FROM CategoryRec2 AS cr INNER JOIN 
    CategoryRec AS c ON cr.Parentid = c.Id 
    WHERE c.Parentid IS NOT NULL 
) 
SELECT Id, Parentid, Name, [Level] 
FROM CategoryRec2 
+0

我不明白你爲什麼需要CategoryRec2查詢。當然,你只需要在CategoryRec查詢的'UNION ALL'之後的查詢中添加「WHERE c.Parentid IS NOT NULL」子句。然後你可以放棄CategoryRec2類型,它應該可以工作(?) – Asher

+0

OK ..我今晚會試試看看它是否有效。 – Luke101