【问题标题】:Recursive update in SQLiteSQLite 中的递归更新
【发布时间】:2017-07-07 15:57:32
【问题描述】:

我有表objs,其中包含有关文件和目录的信息。 每条记录都有行

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

我想将其重写为递归方法,但我坚持

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表的更新以及如何更改id中的值

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

WITH中,将更新语句中更新行的id的值传递给这个选择器值...

非常感谢!

【问题讨论】:

    标签: sql sqlite recursion


    【解决方案1】:

    解决了这个查询,灵感来自帖子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
    )
    

    【讨论】:

    • works_for_alice 不是一个您必须采用不变的 SQL 关键字,n/m 也不是好名字。
    • 我知道,这只是实验代码 sn-p 它是在深夜 3 小时内复制粘贴并重新编写的 :)...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2020-09-05
    • 2012-03-17
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    相关资源
    最近更新 更多