2013-11-14 170 views
1

我有一个表,允许父行有多个孩子:选择父母和所有的孩子要么给家长或孩子的ID

ID ParentID Name 
1  NULL  'I am the parent' 
2  1   'I am a child' 
3  1   'I am another child' 
4  NULL  'I am a loner' 

我在寻找最简单,最有效的方式可以从该“家族”中的任何给定ID返回“家族”中的所有行。如果给出1,2或3,则前三行将被返回,并且如果给定4,则仅返回最后一行*。

如果合理(或某种存储过程),我很乐意将其作为单个SQL调用,因为这会经常调用。

我最好的尝试已导致多个呼叫:

SELECT ParentID FROM Person WHERE ID = @id 

/*if (parentid == null)*/ 
    SELECT * FROM Person WHERE ID = @id OR ParentID = @id 
/*else*/ 
    SELECT * FROM Person WHERE ID = @parentid OR ParentID = @parentid 

* 父母本身不能有一个父类,所以应该不需要递归。

+0

有什么错你的第二个查询? http://sqlfiddle.com/#!6/5f39c/2/0它似乎返回你想要的。 –

+0

@TimSchmelter,因为如果@ id = 2或@id = 3,所有三行都需要返回 – snumpy

回答

3

您需要这些OR s到找到你的家人:

SELECT * FROM Person WHERE ID = @id 
OR ParentID = @id 
OR ID = (SELECT ParentID FROM Person p2 
     WHERE ID = @id) 
OR ParentID = (SELECT ParentID FROM Person p2 
     WHERE ID = @id) 

Demo

+0

您可以使用'IN(Id,ParentID)'http://sqlfiddle.com/#!来删除重复的子查询。 6/5f39c/16我知道这是一个奇怪的用法 –

+0

@ConradFrix:谢谢,有趣。之前我没有以这种方式使用过“IN”。但是,我仍然喜欢子查询。更重要的是自SQL Server将(希望)优化它们。 –