2013-06-05 25 views
1

我有一個父子(多對多)表,其中包含workgroup_idparent_id(工作組可能有多個父母)。在SQL Server中檢索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

遞歸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) 
+0

嗨查理感謝您的快速反應,我使用SQL Server 2008R2,我在新的領域任何機會,你能告訴我一個短的代碼示例? – Zvi

+0

完成 - 如果你有循環的祖先,遞歸CTE可能會變得混亂。所以你的里程可能有所不同 –

+0

對於初學SQL Server的人來說,這是一個非常高級的話題。閱讀此處以獲取CTE的低點:http://msdn.microsoft.com/en-us/library/ms190766%28v=sql.105%29.aspx –