2012-08-02 48 views

回答

8

如何使這樣的方法

DECLARE @Categories TABLE(
     CategoryId INT, 
     CategoryName VARCHAR(20), 
     ParentCategoryId INT 
) 

INSERT INTO @Categories SELECT 1, '1',NULL 
INSERT INTO @Categories SELECT 2, '2',NULL 

INSERT INTO @Categories SELECT 3, '1.3',1 
INSERT INTO @Categories SELECT 4, '1.4',1 

INSERT INTO @Categories SELECT 5, '1.3.5',3 
INSERT INTO @Categories SELECT 6, '1.3.6',3 
INSERT INTO @Categories SELECT 7, '1.3.6.7',6 

INSERT INTO @Categories SELECT 8, '1.4.8',4 

DECLARE @CatID INT, 
     @NthLevel INT 
SELECT @CatID = 1, 
     @NthLevel = 2 

;WITH Vals AS (
     SELECT *, 
       1 AS CatLevel 
     FROM @Categories c 
     WHERE CategoryId IS NULL 
     UNION ALL 
     SELECT c.*, 
       CatLevel + 1 AS CatLevel 
     FROM Vals v INNER JOIN 
       @Categories c ON c.ParentCategoryId = v.CategoryID 
) 
SELECT * 
FROM Vals 
WHERE CatLevel = @NthLevel 

這將遞歸地構建樹結構,並將其限制在您正在查找的樹級別上。

+0

+1現在,這個問題被編輯爲說「第n個孩子/孩子」這個答案使得更多的意義:) – Andomar 2012-08-02 06:40:20

+0

非常感謝很多的旁觀者 – shajivk 2012-08-02 06:54:13

1
SELECT ParentCategoryId, 
    , CategoryId AS [n-th child] 
FROM (
    SELECT CategoryId 
    , ParentCategoryId 
    , ROW_NUMBER() OVER (PARTITION BY ParentCategoryId ORDER BY CategoryId) as ChildNumber 
    FROM Categories 
) p 
WHERE ChildNumber = %N 
+0

謝謝,讓我檢查這個 – shajivk 2012-08-02 06:36:16

+0

對不起,這沒有工作。我不是在尋找表中的第n個記錄,我需要的是類別的第n個孩子 – shajivk 2012-08-02 06:45:53

+0

我相信它完全是這樣。它爲表中的每個ParentCategoryId返回第n個孩子。 – DNNX 2012-08-02 06:56:44

0

要找到N個孩子,通過類別編號排序,M類:

select * 
from (
     select row_number() over (order by c.CategoryId) as rn 
     ,  c.* 
     from Categories p 
     join Categories c 
     on  p.CategoryId = c.ParentCategoryId 
     where p.CategoryId = M 
     ) 
where rn = N