我有一个父子(多对多)表,其中包含workgroup_id
和parent_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
任何想法如何实现这一目标?我想它需要某种递归,但我不太清楚如何去做这个
非常感谢你 问候 兹维
答案 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)