2017-02-18 11 views
1

У меня есть таблица objs, которая содержит информацию о файлах и каталогах. Каждая запись имеет строкиРекурсивное обновление в SQLite

id, fileSize, parentID, dirSize. 

Каждый (но не первая запись) из записи имеет ParentID, что равно идентификатор родительского каталога.

Я хочу считать рекурсивные размеры каждой директории.

Простое решение, без рекурсивный и на основе файлов и директорий трактов

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 таблицы и как изменить значение идентификатора в

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

в WITH, чтобы перейти в эту величину селекторном идентификатор обновления строки в заявлении обновления ...

Большое спасибо!

ответ

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 часа глубокой ночи:) ... –

 Смежные вопросы

  • Нет связанных вопросов^_^