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 に答える