2010-04-27 108 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