0

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

这适用于 @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 表达式,并为 CTE 生成的每个记录以及 TableB 中的一些字段创建一个插入到 TableC 中

(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 的孩子的孩子的孩子...

4

2 回答 2

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
于 2013-07-22T10:09:33.403 回答
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
于 2013-07-22T10:06:37.587 回答