2014-12-08 89 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

相關問題