选择父级和所有给定父级或子级ID的子级

时间:2013-11-14 15:34:37

标签: sql sql-server

我有一个允许父行拥有多个子项的表:

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

* 父母本身不能拥有父母,因此不需要递归。

1 个答案:

答案 0 :(得分:3)

您需要这些OR才能找到您的家人:

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