TSQL foreach记录加入cte和insert

时间:2013-07-22 08:39:51

标签: sql-server tsql recursion common-table-expression

我需要创建一个SQL-Query,它使用递归CTE从TableA中获取记录。 (树结构)。我把“叶子”传递给他,想知道回到根的路。

这适用于@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
        ) 

我现在需要做的是,我从TableB获取每条记录 并使用tableB.SOME_ID作为CTE表达式并创建一个插入到TableC foreach记录中的CTE生成以及来自TableB的一些字段

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

所以我的问题是,如何将tableB.SOME_ID传递给cte表达式?

所以在TableA中我得到了这样的东西:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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