检索SQL Server中Id的所有后代

时间:2013-06-05 09:30:42

标签: sql-server recursion many-to-many parent-child

我有一个父子(多对多)表,其中包含workgroup_idparent_id(工作组可能有多个父项)。

我需要将每个父母的所有后代(即孙子,曾孙子等)插入到目的地表中,等级的数量是未知的并且可以改变。 例如我的原始表是:

wpwpr_workgroup wpwpr_parent
4   3
5   3
6   3
7   3
8   3
9   3
10  3
11  10
12  10
13  10
14  3
15  3
16  3
17  16
18  16
19  16
20  3
21  20
22  20
23  20
24  16
25  16
26  16
27  28
28  3
30  3
31  3
32  3
33  3
34  3

我需要到目的地表看起来像这样:

wpwpr_workgroup wpwpr_parent
10  3
11  3
12  3
16  3
17  3
18  3
11  10
12  10
17  16
18  16

任何想法如何实现这一目标?我想它需要某种递归,但我不太清楚如何去做这个

非常感谢你 问候 兹维

1 个答案:

答案 0 :(得分:0)

递归CTE可能就是答案 - 但是如果你的结构可以有多个父母/圆形祖先,它会很麻烦。

您还可以使用基于集合的循环获得相当有效的解决方案(循环的每次迭代都会对最后写入的集合进行父搜索,并检查答案集中是否已存在节点。

如果您发布更多样本数据,我们可能会为您提供一些SQL来帮助您入门。

此外 - 您使用的是哪个版本的SQL Server? CTE仅在2005 +

中提供

对于您发布的数据,这将有效:

    USE tempdb
GO

IF OBJECT_ID('tempdb..#sample') IS NOT NULL DROP TABLE #sample
GO

CREATE TABLE #sample (
      wpwpr_workgroup INT
    , wpwpr_parent INT
    )
INSERT #sample (wpwpr_workgroup, wpwpr_parent)
VALUES
      (10,  3)
    , (11,  10)
    , (12,  10)
    , (16,  3)
    , (17,  16)
    , (18,  16)
GO

SELECT * FROM #sample

-- CTE
; WITH descendants AS (
    -- Anchor Definition
    SELECT wpwpr_workgroup AS [workGroup]
         , wpwpr_parent AS [Parent]
    FROM #sample
    -- Recursive Definition
    UNION ALL SELECT
        d.[workGroup] AS [workGroup]
         , s.wpwpr_parent AS [Parent]
    FROM
        descendants AS d
        JOIN #sample AS s ON s.wpwpr_workgroup = d.[Parent]
    )
SELECT * FROM descendants ORDER BY [workGroup], [Parent]

结果是:

workGroup   Parent
----------- -----------
10          3
11          3
11          10
12          3
12          10
16          3
17          3
17          16
18          3
18          16

(10 row(s) affected)