2017-02-18 88 views
1

我有表objs,其中包含有关文件和目录的信息。 每个记录有记录的行SQLite的递归更新

id, fileSize, parentID, dirSize. 

每个(但不是第一条记录)具有的parentID,这等于父目录的ID。

我想递归计算每个目录的大小。

简单的解决方案,而无需递归和基于文件和显示目录路径是

update objs set dirSize= (
select sum(b.fileSize) from objs b where b.fullPath like objs.fullPath||'\%' and b.isDir=0) 
where isDir=1 

我想将它改写为递归方法,但我stucked上

WITH RECURSIVE 
    works_for_alice(n, m) AS (
    select id, fileSize from objs where id=9 
    UNION 
    SELECT a.id, a.fileSize FROM objs a, works_for_alice b 
    WHERE a.parentID=b.n 
) 
SELECT sum(m) FROM works_for_alice 

我无法理解,如何应用此选择

SELECT sum(m) FROM works_for_alice 

更新到objs表和如何在WITH改变ID的值在

select id, fileSize from objs where id=**9** 

,传递到UPDATE语句更新行的id的这个选择值...

非常感谢您!

回答

0

解决了这个查询,即通过邮局sqlite CTE with UPDATE和SQLite with文档https://www.sqlite.org/lang_with.html启发:

update objs set dirSize = 0; 
update objs set dirSize = (
      WITH RECURSIVE 
    works_for_alice(n, m) AS(
    select objs.id, 0 
    UNION all 
    SELECT a.id, a.fileSize FROM objs a, works_for_alice b 
    WHERE a.parentID = b.n 
) 
SELECT sum(m) FROM works_for_alice 
) 
+0

'works_for_alice'是*不*一个SQL关键字,你将不得不采取不变,'N' /'我也不是很好的名字。 –

+0

我知道,它只是实验性的代码片段,它在深夜3小时内被复制粘贴并重新写入:)... –