递归地找到给孩子的所有祖先

时间:2012-07-22 08:37:41

标签: sql-server

给定一个子ID,我需要返回一个查询,其中包含该孩子的所有父母以及他们的父母,直到我找到根父母。 例如,给定这些数据:

ID / Parent ID
1  /  0
2  /  1
3  /  2
4  /  0
5  /  3

因此,如果我传入ID 5,我想查询结果:

ID / Parent ID
1  /  0
2  /  1
3  /  2

此表不适用于hierarchyid类型,因此我怀疑这需要使用CTE完成,但不知道如何使用。如果它可以在SQL查询/ proc中完成,那么任何帮助都将受到赞赏。

由于

1 个答案:

答案 0 :(得分:25)

这或多或少是您想要的:

-- CTE to prepare hierarchical result set
;WITH #results AS
(
    SELECT  id, 
            parentid 
    FROM    [table] 
    WHERE   id = @childId
    UNION ALL
    SELECT  t.id, 
            t.parentid 
    FROM    [table] t
            INNER JOIN #results r ON r.parentid = t.id
)
SELECT  *
FROM    #results;

<强>参考:

工作示例:

-- create table with self lookup (parent id)
CREATE TABLE #tmp (id INT, parentid INT);

-- insert some test data
INSERT INTO #tmp (id, parentid) 
SELECT 1,0 UNION ALL SELECT 2,1 UNION ALL SELECT 3,2
UNION ALL SELECT 4,0 UNION ALL SELECT 5,3;

-- prepare the child item to look up
DECLARE @childId INT;
SET @childId = 5;

-- build the CTE
WITH #results AS
(
    SELECT  id, 
            parentid 
    FROM    #tmp 
    WHERE id = @childId
    UNION ALL
    SELECT  t.id, 
            t.parentid 
    FROM    #tmp t
            INNER JOIN #results r ON r.parentid = t.id
)

-- output the results
SELECT  * 
FROM    #results 
WHERE   id != @childId 
ORDER BY id;

-- cleanup
DROP TABLE #tmp;

<强>输出:

1 | 0
 2 | 1
 3 | 2