【发布时间】:2021-02-20 18:49:06
【问题描述】:
我在使用 ID 和父级的表中为“组”使用递归 CTE。
第一个表“组”(Project_Estimate_Group) 是具有 ID 和父级的层次结构。第二个表“GroupOptions”(Project_Estimate_Group_Option)适应组和选项之间的多对多关系。如果您将选项添加到任何级别,它会向下渗透到该分支中的任何子级。
我需要将 Groups 的父级和递归子级加入到 GroupOptions 中,并让这些联接在每个递归级别中“涓涓细流”,以便在每个级别您都可以加入当前选项以及加入选项分支中的每个父级。
我需要为没有 OptionID 的每个组设置一行,为每个加入的 OptionID 设置一行。有些关卡没有选项。
这可以通过递归 CTE 来完成吗?
Table1“组”有
Parent ID
-------- ------
NULL 1
1 2
2 3
NULL 4
4 5
Table2“GroupOptions”有
GroupID OptionID
-------- --------
1 10
1 11
2 12
5 20
加入后我需要
Parent ID OptionID
-------- -------- ----------
NULL 1 0
NULL 1 10
NULL 1 11
1 2 0
1 2 10
1 2 11
1 2 12
2 3 0
2 3 10
2 3 11
2 3 12
NULL 4 0
4 5 0
4 5 20
以下查询将关闭,但只会返回当前组及其父级的选项,而不是其祖父级或更高级别的选项
DECLARE @EstimateID int = (SELECT MAX(ID) FROM dbo.Project_Estimate);
WITH egroup (EstimateID, ParentID, GroupID, OptionID) AS
(
SELECT @EstimateID, NULL, peg.ID, 0
FROM dbo.Project_Estimate_Group peg
WHERE peg.Estimate = @EstimateID AND peg.Parent IS NULL
UNION ALL
SELECT @EstimateID, NULL, peg.ID, pego.OptionID
FROM dbo.Project_Estimate_Group peg
JOIN dbo.Project_Estimate_Group_Option pego on peg.ID = pego.GroupID
WHERE peg.Estimate = @EstimateID AND peg.Parent IS NULL
UNION ALL
SELECT @EstimateID, peg.Parent, peg.ID, 0
FROM dbo.Project_Estimate_Group peg
JOIN egroup on peg.Parent = egroup.GroupID
UNION ALL
SELECT @EstimateID, peg.Parent, peg.ID, pego.OptionID
FROM dbo.Project_Estimate_Group peg
JOIN egroup on peg.Parent = egroup.GroupID
JOIN dbo.Project_Estimate_Group_Option pego on peg.ID = pego.GroupID
UNION ALL
SELECT @EstimateID, peg.Parent, peg.ID, pego.OptionID
FROM dbo.Project_Estimate_Group peg
JOIN egroup on peg.Parent = egroup.GroupID
JOIN dbo.Project_Estimate_Group_Option pego on peg.Parent = pego.GroupID
)
SELECT DISTINCT EstimateID, ParentID, GroupID, OptionID
FROM egroup
JOIN dbo.Project_Estimate e on egroup.EstimateID = e.ID
【问题讨论】:
标签: sql-server tsql