1

我有以下 SQL 架构:

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

parentId != NULL 的项目是根项目,并且在“路径”中具有完整路径。子文件夹仅按其名称和描述它们位于根文件夹下方的级别来保存。我现在想为此数据构建所有项目的完整路径。

CTE 在 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、路径和级别上创建了一个索引,但这似乎并没有太大改善。

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

4

1 回答 1

1

如果根和子级之间的级别数是可变的,则不能这样做。您所做的事情是不正确的,充其量您可以与直接孩子一起加入根。

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

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

于 2013-03-25T17:43:47.770 回答