根据父级或子级的 ID 选择父级和所有子级

snu*_*mpy 2 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'
Run Code Online (Sandbox Code Playgroud)

我正在寻找最简单、最有效的方法来从“系列”中的任何给定 ID 返回“系列”中的所有行。如果给定 1、2 或 3,则将返回前三行,如果给定 4,则仅返回最后一行*。

如果合理的话,我希望将其设为单个 SQL 调用(或某种存储过程),因为这会被频繁调用。

我的最佳尝试导致了多次通话:

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'
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*ter 5

您需要这些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)
Run Code Online (Sandbox Code Playgroud)

Demo