0

我在我的数据库中管理了一个父子关系,如下所示:

ID   |   ParentID    
A    |    <NULL>    
B    |    A    
C    |    A    
E    |    <NULL>    
F    |    E    

我想构建一个表值函数,该函数将返回一个表,该表本质上允许您轻松确定属于您的“家庭”的所有其他项目(跟踪父母并不是非常重要,但它会很好如果这可能是结果的一部分)看起来像这样:

ID   | Group Member    
A    |    A    
A    |    B    
A    |    C    
B    |    A    
B    |    B    
B    |    C  
C    |    A    
C    |    B    
C    |    C  
E    |    E    
E    |    F    
F    |    E    
F    |    F

您可以看到,我基本上想将属于“家庭”的每条记录与属于家庭的所有其他成员进行匹配。这只是向我尖叫,有一种相当简单的方法可以做到这一点,但我只是用这个把头撞到墙上

4

2 回答 2

1

表自身的 Join On ISNULL(Parent,ID) 应该返回所需的结果。

declare @a Table (ID varchar(10),Parent Varchar(10))
Insert into @a Values ('A',NULL) ,('B' , 'A'),('C','A'),('E',NULL) ,('F','E')
Select a.ID,b.ID  as GroupMember
from @a a
JOIN @a b ON ISNULL(a.Parent,a.ID)=ISNULL(b.Parent,b.ID) 
于 2014-12-08T03:48:30.070 回答
0

这不是交叉产品。这是一个递归/分层查询。假设您在关系中没有周期,您可以执行以下操作:

with cte as (
      select id, id as groupmember
      from table t
      where parent is not null
      union all
      select cte.id, t.id as groupmember
      from table t join
           cte
           on cte.parentid = t.id
    )
select *
from cte;
于 2014-12-08T03:39:25.367 回答