2016-07-28 62 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.但是,我無法正確加入它。 –