将姐妹 table 值应用于主要 table 中的所有 Parent/child 关系
Apply Sister table value to All Parent/child relationships in main table
背景:
我有一个相当复杂的场景(至少对我而言),因为我想 return 来自 2 table 的数据,其中一个包含 parent/child 或层次结构关系并且只有一些家庭成员可以从其他家庭成员中引用 table。
假设我有3个tables,数据如下:
TABLE 1 - 定义与名称的 parent/child 关系。可以是多个级别,不仅仅是 parent 和 child,而是完整的层次结构
Id | Table1Name | ParentId
---------------------------
1 | Root | NULL
2 | Child1 | 1
3 | Chile2 | 1
4 | Root2 | NULL
5 | Child1-2 | 4
6 | Child2-2 | 4
TABLE 2 - 以下 TABLE 3 的 child table。也参考 TABLE 上面的 1
Id | Table2Name | Table1Id | Table3Id
-------------------------------------------
20 | Test1 | 2 | 40
21 | Test2 | 2 | 40
22 | Test3 | 3 | 40
23 | Test4 | 3 | 40
24 | Test5 | 5 | 41
25 | Test6 | 5 | 41
26 | Test7 | 6 | 41
27 | Test8 | 6 | 41
TABLE 3 - Parent table - 仅作为此示例的参考,未在查询中使用
Id | Table3Name
-----------------
40 | Parent1
41 | Parent2
问题:
我正在尝试开发一个查询,该查询将列出 TABLE 1 中的所有行,但将包括与该 parent/child 关系的所有条目关联的 Table3Id。所以对于这个例子,我期待一个如下所示的结果集:
Id | Table1Name | ParentId | Table3Id
--------------------------------------
1 | Root | NULL | 40
2 | Child1 | 1 | 40
3 | Chile2 | 1 | 40
4 | Root2 | NULL | 41
5 | Child1-2 | 4 | 41
6 | Child2-2 | 4 | 41
请注意,上面的第 1 行和第 4 行与 TABLE2 没有直接关系,但分别通过第(2 和 3)行和(5 和 6)行有间接关系。
我确定有一种方法可以做到这一点,但我对正确的代码组合一无所知。
您使用递归 CTE,从在表 2 中具有匹配项的所有子项开始,然后在树中向上移动。
WITH recHierarchy AS
(
SELECT t1.Id, t1.ParentId, t2.Table3Id
FROM #table1 t1
INNER
JOIN #table2 t2
ON t1.Id = t2.Table1Id
UNION ALL
SELECT parent.Id, parent.ParentId, child.Table3Id
FROM #table1 parent
JOIN recHierarchy child
ON child.ParentId = parent.Id
)
SELECT DISTINCT Id, ParentId, Table3Id FROM recHierarchy
如果表 1 中存在如下层次结构,这也适用:
Id | Table1Name | ParentId
---------------------------
7 | Root3 | NULL
8 | Child3-1 | 7
9 | Chile3-1-1 | 8
并且 Table3Id 仅在 Id = 9 上定义。
背景:
我有一个相当复杂的场景(至少对我而言),因为我想 return 来自 2 table 的数据,其中一个包含 parent/child 或层次结构关系并且只有一些家庭成员可以从其他家庭成员中引用 table。
假设我有3个tables,数据如下:
TABLE 1 - 定义与名称的 parent/child 关系。可以是多个级别,不仅仅是 parent 和 child,而是完整的层次结构
Id | Table1Name | ParentId
---------------------------
1 | Root | NULL
2 | Child1 | 1
3 | Chile2 | 1
4 | Root2 | NULL
5 | Child1-2 | 4
6 | Child2-2 | 4
TABLE 2 - 以下 TABLE 3 的 child table。也参考 TABLE 上面的 1
Id | Table2Name | Table1Id | Table3Id
-------------------------------------------
20 | Test1 | 2 | 40
21 | Test2 | 2 | 40
22 | Test3 | 3 | 40
23 | Test4 | 3 | 40
24 | Test5 | 5 | 41
25 | Test6 | 5 | 41
26 | Test7 | 6 | 41
27 | Test8 | 6 | 41
TABLE 3 - Parent table - 仅作为此示例的参考,未在查询中使用
Id | Table3Name
-----------------
40 | Parent1
41 | Parent2
问题:
我正在尝试开发一个查询,该查询将列出 TABLE 1 中的所有行,但将包括与该 parent/child 关系的所有条目关联的 Table3Id。所以对于这个例子,我期待一个如下所示的结果集:
Id | Table1Name | ParentId | Table3Id
--------------------------------------
1 | Root | NULL | 40
2 | Child1 | 1 | 40
3 | Chile2 | 1 | 40
4 | Root2 | NULL | 41
5 | Child1-2 | 4 | 41
6 | Child2-2 | 4 | 41
请注意,上面的第 1 行和第 4 行与 TABLE2 没有直接关系,但分别通过第(2 和 3)行和(5 和 6)行有间接关系。
我确定有一种方法可以做到这一点,但我对正确的代码组合一无所知。
您使用递归 CTE,从在表 2 中具有匹配项的所有子项开始,然后在树中向上移动。
WITH recHierarchy AS
(
SELECT t1.Id, t1.ParentId, t2.Table3Id
FROM #table1 t1
INNER
JOIN #table2 t2
ON t1.Id = t2.Table1Id
UNION ALL
SELECT parent.Id, parent.ParentId, child.Table3Id
FROM #table1 parent
JOIN recHierarchy child
ON child.ParentId = parent.Id
)
SELECT DISTINCT Id, ParentId, Table3Id FROM recHierarchy
如果表 1 中存在如下层次结构,这也适用:
Id | Table1Name | ParentId
---------------------------
7 | Root3 | NULL
8 | Child3-1 | 7
9 | Chile3-1-1 | 8
并且 Table3Id 仅在 Id = 9 上定义。