2013-06-05 2 views
1

У меня есть родительско-дочерняя (многие-многие) таблицы, которая содержит workgroup_id и parent_id (рабочая группа может иметь более одного родителя).Извлечение всех потомков Id в SQL Server

Мне нужно вставить в таблицу назначения все потомки каждого родителя (т. Е. Внуки, правнуки и т. Д.), Количество уровней неизвестно и может измениться. Например моя оригинальная таблица:

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 вы используете КТР являются доступны только из 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

Привет Charlie Спасибо за быстрый ответ, я использую SQL сервер 2008R2, я новичок в поле любой шанс, что вы можете показать мне короткий пример кода? – Zvi

+0

Выполнено - Рекурсивные CTE могут стать беспорядочными, если у вас есть круговые предки. Таким образом, ваш пробег может отличаться. –

+0

Для кого-то нового для SQL Server это довольно сложная тема. Прочитайте здесь, чтобы получить низкое значение в CTE: http://msdn.microsoft.com/en-us/library/ms190766%28v=sql.105%29.aspx –

Смежные вопросы