2013-07-22 49 views
0

我需要创建一个使用递归CTE从TableA中提取记录的SQL查询。 (树结构)。我把他的“叶子”传给他,并想知道回到根部的方式。TSQL每个记录加入一个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,我抓住每一个记录表B从和 使用tableB.SOME_ID的CTE表达,并创建一个插入到表C的foreach记录CTE产生再加上从表B某些领域

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

所以在这里我的问题是,我该如何通过tableB.SOME_ID的CTE EXPR激情?

因此,在表A我是这样的:

ID,SUB_ID

1,2

2,3

2,4

2,5

5,6

7,8

8,9

如果我通过他SUB_ID = 5时,CTE返回我的记录#1,#2,#3,#4,#5 作为SUB_ID = 5是ID的......孩子的孩子的孩子= 1

+0

只是'JOIN' tableB的两个'SELECT'statements。 – Alexander

+0

我不能,因为在UNION部分,没有任何parent.ID或parent.Sub_ID的TableB条目。由于cte为1个tableA记录创建了n条记录。我扩大我的开幕帖子 – 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

没有想到这一点,就像一个魅力。 http://msdn.microsoft.com/de-de/library/ms175156%28v=sql.105%29.aspx在某些Syntaxproblems上搜索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