2017-02-18 41 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小時內被複制粘貼並重新寫入:)... –