我正在使用一个闭包表,就像在这个答案中找到的那样(很棒的答案顺便说一下):
hierarchical/tree database for directories in filesystem
您是否知道基于路径字符串是否可以使用单个查询获取记录?
路径字符串是由/
分隔的列名。例如,来自该问题的ROOT/Dir2/Dir4/Dir7
应该会获得Dir7
记录。
答案 0 :(得分:2)
在其基本形式中,闭包表只包含所有可传递连接的对。
要在没有递归的情况下回答您的查询,连接的路径字符串必须已经存在。
您是否只需要从根节点开始选择路径?
您可以按照以下两个选项之一进行操作:
您是否需要相对于某个起始节点进行选择?
在这种情况下,您可以在闭包表中存储每对的相对路径,例如,使其闭合(ancestor_id int,descendant_id int,relative_path_between varchar)。用于构建闭包表的INSERT操作可以通过相应的concat表达式轻松扩展,例如,为父X带有相对路径Z的新子Y,你会这样做
insert into closure_table(ancestor_id, descendant_id, relative_path_between)
select ancestor_id,
<Y>,
relative_path_between || '/' || <Z>
from closure_table
where descendant_id = <X>
union all
select <Y>,<Y>,'';
(参见Bill Karwin的slides,幻灯片68 - 78)