Для этого примера таблицы:
CREATE TABLE filesystem(path TEXT PRIMARY KEY, size INTEGER, is_directory INTEGER);
INSERT INTO filesystem VALUES ('/',0,1)
, ('/projects/',0,1),('/projects/README.md',20,0)
, ('/projects/python/',0,1), ('/projects/python/main.py',50,0)
, ('/projects/python/util.py',70,0);
Этот запрос:
SELECT path AS directory
, (SELECT sum(size)
FROM filesystem AS f2
WHERE f2.path LIKE f.path || '%' AND f2.is_directory = 0) AS total_size
FROM filesystem AS f
WHERE is_directory = 1
ORDER BY path;
выдаст:
directory total_size
-------------------- ----------
/ 140
/projects/ 140
/projects/python/ 120
По сути, для каждого каталога он суммируетразмеры всех записей с этим каталогом в качестве префикса их пути.
Чтобы обновить размер строк каталога вместо их вычисления на лету:
UPDATE filesystem AS f
SET size = (SELECT sum(f2.size)
FROM filesystem AS f2
WHERE f2.path LIKE f.path || '%' AND f2.is_directory = 0)
WHERE f.is_directory = 1;