1

我有一个父子(多对多)表,其中包含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

任何想法如何实现这一目标?我想这将需要某种递归,但我不太确定如何去做

非常感谢您问候 Zvi

4

1 回答 1

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)
于 2013-06-05T09:35:57.190 回答