2016-03-03 8 views
3

樣本數據的返回其在層次結構中第N級的類別的名稱(類別與parentId的-1是在第一級)

WITH sample_data AS (
SELECT CategoryId, 
     ParentCategoryId, 
     Name, 
     Keywords 
FROM (VALUES 
(100, -1, 'business',   'Money'), 
(200, -1, 'tutoring',   'teaching'), 
(101, 100, 'Accountting',  'taxes'), 
(102, 100, 'Taxation',   NULL), 
(201, 200, 'Computer',   NULL), 
(103, 101, 'Corporate Tax', NULL), 
(202, 201, 'operating system', NULL), 
(109, 101, 'Small business Tax', NULL)) as c(CategoryId, ParentCategoryId, Name, Keywords) 
) 

樣品輸入/輸出:

Input: 2 
Output: 101, 102, 201 

Input: 3 
Output: 103, 109, 202 

我一直在嘗試與GROUP BY類,但它不能正常工作,能有人幫我出遞歸CTE這樣做(我很新)

TIA

+0

這裏'輸入:2' - 2點,哪一列?例如。如果它指向'ParentCategoryID'則輸出應該是''101,102'。 201如何輸出? –

+0

@Krishnraj if parentcategoryid = -1那麼它是第一級,所以如果輸入是2(那意味着第二級),那麼如果你看到類別ID 100和200已經在第一級別,所以類別ID 101,102,201將落入第二級別bcoz他們的parentcatergoryid是第一級(100和200)。如果你看到輸入3(第三級)103,202,109,parentcategoryid來自第二級(101,201,101),所以它們落入第三級。 – Ramesh

回答

2

可以使用followinq查詢:

DECLARE @level INT = 2 

;WITH CTE AS (
    -- Start from root categories 
    SELECT CategoryId, ParentCategoryId, Name, Keywords, level = 1 
    FROM Cat 
    WHERE ParentCategoryId = -1 

    UNION ALL 

    -- Obtain next level category 
    SELECT c1.CategoryId, c1.ParentCategoryId, 
      c1.Name, c1.Keywords, level = c2.level + 1 
    FROM Cat AS c1 
    INNER JOIN CTE AS c2 ON c1.ParentCategoryId = c2.CategoryId 
    WHERE c2.level < @level -- terminate if specified level has been reached 
) 
SELECT CategoryId 
FROM CTE 
WHERE level = @level 

輸出:

CategoryId 
========== 
201 
101 
102 
相關問題