2010-04-27 83 views
4

我有一個包含此數據records(ID, ParentID)表:如何跟蹤表格行之間的ID/ParentID關係?

ID ParentID 
1 null 
2 1 
3 2 
4 2 
5 3 
6 null 
7 6 

如果繪製在層次結構此表作爲一個家庭,1,2,3,4,5將彼此相關。

我想找到一種方法來傳遞一個ID(如3),使它給我其他家庭成員。我使用C#和SQL,要麼會做 - 我想找到這樣一個結果:

3 - result 1,2,4,5 
2 - result 1,3,4,5 
6 - result 7 
and so on 

我想找到我傳遞,祖父母,孩子們的ID的父母和孫子(如我的例子)。

+0

實際數據有多深? CTE可以完成這項工作......然而,當我必須這樣做時,我只是手動創建了一個節點樹(如表格),允許我通過BETWEEN' – 2010-04-27 12:00:44

+0

查詢數據的深度是3或4級 – RMohammed 2010-04-27 12:22:38

+0

你有兩行ID = 3嗎?那麼我認爲這個ID並不是唯一的,或者是最終確定的? – 2010-04-27 12:40:56

回答

3
+0

這種解決方案只給我我的孩子,我還需要我的父母和他們的孩子 – RMohammed 2010-04-27 13:16:00

+1

看到查詢的最後一行: '在c.ParentId = ch.CustomerID' 這是用來尋找孩子。 'on c.CustomerID = ch.ParentId' 會尋找父母。 使用聯合來組合兩個結果集。 – AlexanderMP 2010-04-27 13:20:22

+0

謝謝你這麼多「亞歷山大」 – RMohammed 2010-04-27 14:33:05

0

你可能想看看哪個適合你的問題看似很好的Hierarchy類型。雖然這隻適用於SQL Server 2008

1

這應該這樣做。

CREATE TABLE #Test 
(
    ID int, 
    ParentID int 
) 

INSERT #Test VALUES (1, null) 
INSERT #Test VALUES (2, 1) 
INSERT #Test VALUES (3, 2) 
INSERT #Test VALUES (4, 2) 
INSERT #Test VALUES (5, 3) 
INSERT #Test VALUES (6, null) 
INSERT #Test VALUES (7, 6) 

DECLARE @QueryId int 
SET @QueryId = 2 

-- My parents 
SELECT [ParentID] FROM #Test WHERE [ID] = @QueryID AND [ParentID] IS NOT NULL 
UNION -- My parent's parents 
SELECT [ParentID] FROM #Test WHERE [ID] IN (SELECT [ParentID] FROM #Test WHERE [ID] = @QueryID) AND [ParentID] IS NOT NULL 
UNION -- My parent's children (i.e. my siblings), excluding me 
SELECT [ID] FROM #Test WHERE [ParentID] IN (SELECT [ParentID] FROM #Test WHERE [ID] = @QueryID) AND [ID] != @QueryID 
UNION -- My chidren 
SELECT [ID] FROM #Test WHERE [ParentID] = @QueryId 
UNION -- My chidren's children 
SELECT [ID] FROM #Test WHERE [ParentID] IN (SELECT [ID] FROM #Test WHERE [ParentID] = @QueryId) 

DROP TABLE #Test 
+0

另一個好的解決方案,但它只是2級,如果你設置@QueryId = 5,結果是2,3應該是1,2,3,4作爲1,2, 3在myParents的樹中,4從我父母的一方來,無論如何非常感謝你,感謝所有的成員,我從你們每個人那裏獲取我需要的信息。 – RMohammed 2010-04-27 14:45:41