我有一个自连接场景,其中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
)
答案 0 :(得分:0)
如果你有一个表,其中一个记录引用另一个记录,那个记录引用另一个记录等(如树中的指针),没有简单的方法可以使用纯粹的关系方式选择子树。
如果您使用的是Oracle,则可以转向专为此类案例创建的connect by
运算符。
其他技术可以帮助实现这一目标。最常用的是:
将整个路径存储到每个节点内的根目录,作为文本字符串。比如说,您的节点有path = 'foo.bar.baz'
;这意味着此节点为baz
,其父节点为bar
,根节点为foo
。要从bar
开始有效地选择子树,请使用select ... where path like 'foo.bar.%'
。要选择特定节点,请使用完整路径。当然,path
列应该被编入索引。这种方法最适用于几层深度的树木。
使用nested sets存储树。它有点毛茸茸但可能更容易操作(例如移动子树)。