我有以下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/,但它有重定向问题。
答案 0 :(得分:1)
如果root和children之间的级别数是可变的,则不能这样做。你所做的是不正确的,最多你可以加入直接孩子的根。
将分层数据编码到表中有不同的解决方案,避免了递归查询的需要。例如,见https://communities.bmc.com/communities/docs/DOC-9902。
由于其中一个解决方案是物化路径,您应该意识到实际上您需要的是在每条记录中都有完整路径,这样就可以通过简单的查询为您提供所需的数据。