我需要创建一个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
答案 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