2016-07-28 56 views
1

树的深度我目前在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 

回答

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

请试试?

update table 
set a.tree_depth = b.parent_id 

如果没有入锅,尝试添加这也:

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

这似乎并不工作,因为SQLite不容许FROM UPDATE中。此外,a.tree_depth应该是b.tree_depth + 1.但是,我无法正确加入它。 –