Sql 将姐妹表值应用于主表中的所有父/子关系

Sql 将姐妹表值应用于主表中的所有父/子关系,sql,sql-server,tsql,recursive-query,Sql,Sql Server,Tsql,Recursive Query,背景: 我有一个相当复杂的场景(至少对我来说),我想从两个表返回数据,其中一个表包含父/子或层次关系,并且只有一些族成员可以从另一个表引用 假设我有3个表,数据如下: 表1-使用名称定义父/子关系。可以是多个级别,不仅仅是父级和子级,还可以是完整的层次结构 Id | Table1Name | ParentId --------------------------- 1 | Root | NULL 2 | Child1 | 1 3 | Chile2 | 1 4

背景:

我有一个相当复杂的场景(至少对我来说),我想从两个表返回数据,其中一个表包含父/子或层次关系,并且只有一些族成员可以从另一个表引用

假设我有3个表,数据如下:

表1-使用名称定义父/子关系。可以是多个级别,不仅仅是父级和子级,还可以是完整的层次结构

Id | Table1Name | ParentId
---------------------------
1  | Root       | NULL
2  | Child1     | 1
3  | Chile2     | 1
4  | Root2      | NULL
5  | Child1-2   | 4
6  | Child2-2   | 4
表2——下表3的子表。另见上文表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
表3-父表-仅包含在本例中作为参考,未在查询中使用

Id | Table3Name
-----------------
40 | Parent1
41 | Parent2


问题:

我正在尝试开发一个查询,该查询将列出表1中的所有行,但将包括与该父/子关系的所有条目关联的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行与表2没有直接关系,但分别通过第(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
表3id仅在Id=9上定义


.

如果表2中有一条记录,记录2的Table3Id为40,记录3的Table3Id为41,该怎么办。2&3的父母1的结果应该是什么?这是一个很好的问题,我想在上面的问题中解决,但忘记了。虽然上面没有明确的说明,但是会有业务逻辑来防止这种情况发生。因此,对于所有密集的目的,假设该场景永远不可能存在。非常感谢您的回答和工作示例。那正是我要找的!我很接近这一点,但正朝着相反的方向发展,从父母开始,试图得到不起作用的孩子。再次感谢你!