sql - 根据路径在关闭表中查找记录

标签 sql sqlite hierarchy

我正在使用像在此答案中找到的关闭表(最好的答案是:)

hierarchical/tree database for directories in filesystem

您是否知道可以基于路径字符串通过一次查询获取记录?

路径字符串将是用/分隔的列名称。例如,该问题中的ROOT/Dir2/Dir4/Dir7应为我提供Dir7记录。

最佳答案

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

要不递归地回答您的查询,串联的路径字符串必须已经存在。

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

您可以遵循以下两个选项之一:


将绝对路径存储为节点表中的附加列。
或者直接将绝对路径用作节点的键,因此它们也是闭合表中的外键,您可以直接选择它们。


您是否需要相对于某个起始节点进行选择?

在这种情况下,您可以只将每对的相对路径存储在闭合表中,例如,使其闭合(ancestor_id int,descantant_id int,relative_path_between varchar)。可以通过相应的concat表达式轻松扩展用于构建闭包表的INSERT操作,例如,为具有相对路径Z的父X插入一个新的子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)

关于sql - 根据路径在关闭表中查找记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20000474/

相关文章:

sql - 帮助处理主键和唯一约束

c# - 如何绑定(bind)来自 SQLite 的完整响应?

mysql - 在 MySQL 中选择元组链,邻接列表?

c++ - 使用 Boost,如何在类层次结构更改后反序列化 C++ 类

sql - TSQL 计算列限制

mysql - SQL - 整数类型 - 检测位

sql - SQL Server XML 数据类型中的 LIKE 比较

java - 如何在 Android 的 recyclerview 中访问我的数据库?

java - 可以从 JDBC 中运行 sqlite .import 命令吗?

widget - 如何获得 Tk Widget 的子级?