根据路径在闭包表中查找记录

时间:2013-11-15 11:52:46

标签: sql sqlite hierarchy

我正在使用一个闭包表,就像在这个答案中找到的那样(很棒的答案顺便说一下):

hierarchical/tree database for directories in filesystem

您是否知道基于路径字符串是否可以使用单个查询获取记录?

路径字符串是由/分隔的列名。例如,来自该问题的ROOT/Dir2/Dir4/Dir7应该会获得Dir7记录。

1 个答案:

答案 0 :(得分:2)

在其基本形式中,闭包表只包含所有可传递连接的对。

要在没有递归的情况下回答您的查询,连接的路径字符串必须已经存在。

您是否只需要从根节点开始选择路径?

您可以按照以下两个选项之一进行操作:

  1. 将绝对路径存储为节点表中的附加列。
  2. 或直接使用绝对路径作为节点的键,因此它们也是闭包表中的外键,您可以直接选择它们。
  3. 您是否需要相对于某个起始节点进行选择?

    在这种情况下,您可以在闭包表中存储每对的相对路径,例如,使其闭合(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)