在sqlite3中连接分层文件路径

时间:2013-03-25 15:55:31

标签: sql sqlite

我有以下SQL架构:

 CREATE TABLE Folders(
     id INTEGER PRIMARY KEY, 
     path TEXT NOT NULL, 
     level INTEGER DEFAULT 0,
     parentId INTEGER)

具有parentId!= NULL的项是根项,并且在“path”中具有完整路径。子文件夹仅按其名称和级别进行保存,该级别描述了它们的根文件夹下方的距离。我现在想要从这些数据构建所有项目的完整路径。

CTite在SQLite中不可用,因此我创建了此查询以获取项目的完整路径:

select f.id, ifnull(group_concat(p.path, '\')||'\', '')||f.path as path
  from folders f 
  left outer join (select * from folders order by parentId, level) p on (p.parentId=f.parentId or p.id=f.parentId) and p.level < f.level
  group by f.id

然而,当我用“解释”查看执行计划时,这似乎是非常低效的。我在parentId,path和level上创建了一个索引,但这似乎没有太大改进。

我尝试检查http://www.sitepoint.com/article/hierarchical-data-database/,但它有重定向问题。

1 个答案:

答案 0 :(得分:1)

如果root和children之间的级别数是可变的,则不能这样做。你所做的是不正确的,最多你可以加入直接孩子的根。

将分层数据编码到表中有不同的解决方案,避免了递归查询的需要。例如,见https://communities.bmc.com/communities/docs/DOC-9902

由于其中一个解决方案是物化路径,您应该意识到实际上您需要的是在每条记录中都有完整路径,这样就可以通过简单的查询为您提供所需的数据。