2014-12-08 65 views
0

我有一个父子关系在我的数据库管理是这样的:我如何故意获得“跨产品”(在SQL Server中)的等价物?

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 

你可以看到,我主要想将属于“家庭”的每个记录与作为家庭一部分的每个其他成员相匹配。这只是尖叫着我,有一个相当简单的方法来做到这一点,但我刚刚击败我的头靠在墙上与此

回答

1

一个加入在ISNULL(父,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) 
+0

这样做并且像冠军一样表现。我正在做各种愚蠢的事情,如手动构建列表并尝试合并它们。简单。 – oconnellc 2014-12-16 19:26:35

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; 
+0

这是行不通的吗?任何原因为downvote? – 2014-12-08 23:00:06

相关问题