获取父母和父母的所有子女(包括'this'行)

时间:2011-12-15 18:03:53

标签: sql self-join

我有一个自连接场景,其中linkedAssignment_id是父级,本身是一个赋值(在Assignment表中定义)。

我有:

assignment_id: 1 with no parent.
assignment_id: 2 with 1 as parent.
assignment_id: 3 with 1 as parent.

给定1或2或3,我想返回(1,2,3)。换句话说,如果给出父母的主键,我需要获得所有孩子+父母的id。或者,如果给出了id或任何孩子,我想返回它的父母和所有兄弟姐妹(包括这个兄弟姐妹)。

我想出了以下内容,它看起来很笨拙,效率低下,有人可以提供一些指示吗?

select assignment_id  
from assignment a 
where linkedassignment_id = 3
or assignment_id = 3
union 
(
select assignment_id  
from assignment a 
where linkedassignment_id in ( 
    select linkedassignment_id from assignment b  where assignment_id = 3
    ) 
    union 
    select linkedassignment_id from assignment b  where assignment_id = 3
) 

1 个答案:

答案 0 :(得分:0)

如果你有一个表,其中一个记录引用另一个记录,那个记录引用另一个记录等(如树中的指针),没有简单的方法可以使用纯粹的关系方式选择子树。

如果您使用的是Oracle,则可以转向专为此类案例创建的connect by运算符。

其他技术可以帮助实现这一目标。最常用的是:

  • 将整个路径存储到每个节点内的根目录,作为文本字符串。比如说,您的节点有path = 'foo.bar.baz';这意味着此节点为baz,其父节点为bar,根节点为foo。要从bar开始有效地选择子树,请使用select ... where path like 'foo.bar.%'。要选择特定节点,请使用完整路径。当然,path列应该被编入索引。这种方法最适用于几层深度的树木。

  • 使用nested sets存储树。它有点毛茸茸但可能更容易操作(例如移动子树)。