如何在SQLite中递归计算树深度

时间:2016-07-28 23:07:18

标签: sqlite

我目前在SQLite中有一个类似于以下内容的表,形成一个树状结构:

+-----+-----------+---------------+
| _id | parent_id | tree_depth    |
+=====+===========+===============+
| 1   | 0         | 0             |
| 2   | 1         | (should be 1) |
| 3   | 2         | (should be 2) |
+-----+-----------+---------------+

我的SQLite经验非常有限,而且表非常大,所以我不想手动填写它。是否有可用于更新tree_depth列的查询,以便它正确表示该节点上树的深度?我尝试选择父树的深度并递增,但由于某种原因,它将所有内容都设置为1.

任何建议都将不胜感激。

编辑:我尝试的查询是:

UPDATE table SET tree_depth = (SELECT p.tree_depth FROM table JOIN table p ON p._id=table.parent_id) +1

2 个答案:

答案 0 :(得分:0)

您需要recursive CTE来计算每个条目的树深度。 然后,您可以使用此数据查找值以更新:

WITH RECURSIVE depths(id, depth) AS (
    SELECT _id, 0
    FROM MyTable
    WHERE parent_id = 0
    UNION ALL
    SELECT MyTable._id, depths.depth + 1
    FROM MyTable
    JOIN depths ON MyTable.parent_id = depths.id
)
UPDATE MyTable
SET tree_depth = (SELECT depth
                  FROM depths
                  WHERE depths.id = MyTable._id);

(注意:较旧的Android版本不支持CTE。)

答案 1 :(得分:-1)

请试试?

update table
set a.tree_depth = b.parent_id

如果它没有炒作,请尝试添加它:

FROM table a 
INNER JOIN table b
on a._id= b._id