2013-07-22 4 views
0

Мне нужно создать SQL-Query, который использует рекурсивный CTE для извлечения записей из TableA. (Tree-структура). Я передаю ему «лист» и хочу узнать путь назад к корню.TSQL foreach запись присоединиться к cte и вставить

Это работает с @SOME_ID переменной

;WITH cte_recursive AS 
     ( 
      SELECT ID, SUB_ID FROM tableA 
      WHERE SUB_ID = @SOME_ID 
      UNION ALL 
       SELECT parent.ID, parent.SUB_ID 
       FROM tableA parent 
       INNER JOIN cte_recursive child ON child.ID = parent.SUB_ID 
     ) 

Что мне нужно acchieve сейчас, что я беру каждую запись из TableB и использовать tableB.SOME_ID для выражения КТР и создания вставки в TableC Еогеасп запись КТР генерирует плюс некоторые поля из TableB

(cte_recursive.CHILD_ID, tableB.SomeValue, tableB.SomeOtherValue)

Так что мой вопрос здесь, как я прохожу tableB.SOME_ID к КТР выраж ession?

Так TableA я получил что-то вроде этого:

ID, sub_id

1, 2

2, 3

2, 4

2, 5

5, 6

7, 8

8, 9

Если я прохожу его sub_id = 5, КТР возвращает мне записи # 1, # 2, # 3, # 4, # 5 в sub_id = 5 дитя ребенка ребенка ... от ID = 1

+0

Просто 'JOIN' TableB в обоих' SELECT'statements. – Alexander

+0

Я не могу, поскольку в части UNION нет записи TableB для parent.ID или parent.Sub_ID. Поскольку cte создает n записей для 1 tableA записи. Ill expand мой вступительный пост – CSharpie

ответ

1

вы можете создать таблицу значная функция

create function ftBranchOf 
(
    @SOME_ID int -- actual type of @SOME_ID 
) 
returns table as return 
(
    WITH cte_recursive AS 
    ( 
     SELECT ID, SUB_ID FROM tableA 
     WHERE SUB_ID = @SOME_ID 
     UNION ALL 
      SELECT parent.ID, parent.SUB_ID 
      FROM tableA parent 
      INNER JOIN cte_recursive child ON child.ID = parent.SUB_ID 
    ) 
    select * from cte_recursive 
) 

И затем использовать его в запросе

insert into TableC (...) 
select p.ID, b.SomeValue, b.SomeOtherValue 
from TableB b 
    cross apply ftBranchOf(b.SOME_ID) p 
+0

Havent думал об этом, работает как шарм. http://msdn.microsoft.com/de-de/library/ms175156%28v=sql.105%29.aspx Обнаружено это при поиске CROSS APPLY на некоторых синтаксических проблемах – CSharpie

0

Я не уверен, что вы хотите, так просто угадать

;WITH cte_tableB AS 
(
    SELECT * FROM tableB 
) 
, cte_recursive AS 
( 
    SELECT ID, SUB_ID, SOME_ID FROM tableA 
    WHERE SUB_ID IN (SELECT SOME_ID FROM cte_tableB) 
    UNION ALL 
     SELECT parent.ID, parent.SUB_ID, SOME_ID 
     FROM tableA parent 
     INNER JOIN cte_recursive child ON child.ID = parent.SUB_ID 
) 
INSERT [YourTable] ([YourColumns...]) 
SELECT [YourColumns...] 
FROM cte_recursive 
INNER JOIN cte_tableB ON cte_recursive.SomeID = cte_tableB.SomeID 
Смежные вопросы