2014-02-11 65 views
1

背景SQL Server存儲過程鏈接和取消鏈接記錄,還遞歸添加鏈接?

我有一個表Person代表人羣:

PersonID | FirstName | LastName 
1   | John  | Smith 
2   | Jane  | Smith 
3   | Gary  | Smith 
4   | Susan  | Smith 

...和表SiblingLink代表兄弟姐妹(人與人之間的鏈接):

Person1ID | Person2ID 
1   | 2 
2   | 1 

一個存儲稱爲AddSibling的過程需要2個參數(@Person1@Person2)並且執行INSERTPerson1 -> Person2Person2 -> Person1

當只有2個兄弟姐妹時(這個例子中,約翰和簡現在通過這張表連接在一起),這非常棒。刪除也很簡單。

問題

不過,我需要擴大這個過程來處理這裏Gary (3)Jane (2)被鏈接的情況下,因爲現在因爲John (1)Jane (2)兄弟,他需要也成爲Gary (3)同級。

Person1ID | Person2ID 
1   | 2 
2   | 1 
==== NEW RECORDS ======== 
3   | 2 
2   | 3 
1   | 3 
3   | 1 

問題

什麼是存儲過程的正確方法按照這個遞歸添加的兄弟姐妹的兄弟姐妹?

回答

1

您可以使用查詢來查找兩條記錄之間缺失的鏈接。該查詢查找對誰都有一個三兄弟sl3但那裏是沒有第一和第三的兄弟姐妹之間的直接關係,兄弟姐妹sl1, sl2的:

select sl1.Person1ID 
,  sl2.Person2ID 
from SiblingLink sl1 
join SiblingLink sl2 
on  sl1.Person2ID = sl2.Person1ID 
     and sl1.Person1ID <> sl2.Person2ID 
where not exists 
     (
     select * 
     from siblingLink sl3 
     where sl3.Person1ID = sl1.Person1ID 
       and sl3.Person2ID = sl2.Person2ID 
     ) 

Example at SQL Fiddle.

您可以插入丟失的兄弟姐妹。在一個存儲過程,你可以使用一個while循環重複直到沒有新的刀片:

while 1=1 
    begin 
    ...insert query here... 

    if @@rowcount = 0 
    break 
    end 
+0

+1米歇爾奧巴馬記錄 – Brandon