2010-11-15 94 views
4

我有一個表可以引用表中的另一個成員作爲父項。該父母也可以將另一行作爲其父母......等等。父子鏈的SQL查詢

id  col1  col2 parentID 
1  foo  bar  NULL 
2  blah  boo  1 
3  fob  far  2 
4  wob  lob  NULL 

我想返回鏈給定一個id。所以如果id是3,我會返回第3行,第2行和第1行。如果id是2,我會返回第2行和第1行。如果id是1或4,我會返回該行。

謝謝

回答

9

使用recursive CTE

DECLARE @id INT 
    SET @id = 3 

;WITH hierarchy AS (
    SELECT t.id, t.parentid 
    FROM YOUR_TABLE t 
    WHERE t.id = @id 
UNION ALL 
SELECT x.id, x.parentid 
    FROM YOUR_TABLE x 
    JOIN hierarchy h ON h.parentid = x.id) 
SELECT h.id 
    FROM hierarchy h 

結果:

id 
--- 
3 
2 
1 
1

在這裏你去

SELECT P.cat_id AS parent_cat_id, P.parent_id AS ROOT, P.cat_name AS parent_cat_name, C.parent_id, C.cat_id, C.cat_name FROM categories AS P LEFT OUTER JOIN categories AS C ON C.parent_id=P.cat_id WHERE P.parent_id IS NULL ORDER BY parent_cat_name, cat_name 
+0

其koool :),這樣一個漂亮的查詢,但我認爲它是爲三個層次的層次? – 2013-11-25 14:04:43

1

如果使用遞歸CTE,不忘記添加

h.parentid <> x.id 

您的加入

JOIN hierarchy h ON h.parentid = x.id) 

否則你將只是一個最大遞歸 - 錯誤,因爲它循環

-1
WITH Hierarchy(ChildId, ChildName, Generation, ParentId) 
AS 
(
    SELECT Id, Name, 0, ParentId 
     FROM UserType AS FirtGeneration 
     WHERE ParentId IS NULL   
    UNION ALL 
    SELECT NextGeneration.Id, NextGeneration.Name, Parent.Generation + 1, Parent.ChildId 

     FROM UserType AS NextGeneration 
     INNER JOIN Hierarchy AS Parent ON NextGeneration.ParentId = Parent.ChildId  
) 
SELECT * 
    FROM Hierarchy 
    OPTION(MAXRECURSION 32767) 
+0

請不要只發布代碼,添加說明。 PS:請學習如何在SO上正確格式化代碼;我這次修復了它。 – 2017-06-04 09:08:16