2016-07-28 6 views
1

berechnen habe ich zur Zeit eine Tabelle in SQLite, die etwa wie folgt aussieht, eine baumartige Struktur bilden:Wie rekursiv Baumtiefe in SQLite

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

ich sehr begrenzte SQLite Erfahrung haben und die Tabelle ist recht groß, also würde ich es hassen, es manuell auszufüllen. Gibt es eine Abfrage, die ich verwenden könnte, um die Spalte "tree_depth" so zu aktualisieren, dass sie die Tiefe des Baums an diesem Knoten korrekt darstellt? Ich versuchte, die Baumtiefe des Elternteils zu wählen und zu inkrementieren, aber aus irgendeinem Grund setzte es alles auf 1.

Irgendwelche Ratschläge würden sehr geschätzt werden.

EDIT: Die Abfrage, die ich versuche:

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

Antwort

0

Sie benötigen ein recursive CTE die Baumtiefe jeden Eintrag zu berechnen. Sie können dann diese Daten verwenden, um den Wert zu sehen UPDATE:

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); 

(Hinweis: ältere Android-Versionen unterstützen CTEs nicht.)

-1

Bitte versuchen Sie es?

update table 
set a.tree_depth = b.parent_id 

Wenn es nicht Wok funktioniert, versuchen Sie dies auch addieren:

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

Dies scheint nicht zu arbeiten, wie SQLite nicht erlaubt Von in UPDATE. Außerdem sollte a.tree_depth b.tree_depth + 1 sein. Allerdings kann ich es nicht richtig zu JOIN bringen. –