2017-02-18 15 views
1

私はテーブルobjsを持っていますが、これにはファイルとディレクトリに関する情報が含まれています。 各レコードは、レコードの行SQLiteの再帰的更新

id, fileSize, parentID, dirSize. 

それぞれ(ただし最初のレコード)を有しPARENTIDが有する親ディレクトリのIDに等しいこと。

各ディレクトリのサイズを再帰的に数えたいと思います。

再帰的なファイルおよびdirsのパスに基づいてなし

簡単な解決策は、

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

である私は理解できない私は、再帰的な方法にそれを書き換えたいが、私は

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 

にstucked、この選択方法の適用方法

SELECT sum(m) FROM works_for_alice 

objsテーブルの更新と

はどうもありがとうございました... UPDATE文で更新された行のIDのこのセレクタ値に渡すために、 WITH

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

に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' /' mも良い名前ではない。 –

+0

私は知っている、それはちょうどそれがコピー貼り付けられ、深夜の3時間で書き直された実験的なコードスニペットです:)... –