SQLite is wonderful!
Just today I found that SQLite support queries with a recurse to get the inner sub-trees:
CREATE TABLE els ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE ,pid INTEGER DEFAULT NULL REFERENCES els ,name TEXT ); INSERT INTO els (id, pid, name) VALUES (1, NULL, ’top’); INSERT INTO els (id, pid, name) VALUES (2, 1, ‘x2’); INSERT INTO els (id, pid, name) VALUES (3, 1, ‘x1’); INSERT INTO els (id, pid, name) VALUES (4, 3, ‘y2’); INSERT INTO els (id, pid, name) VALUES (5, 3, ‘y1’); INSERT INTO els (id, pid, name) VALUES (6, 1, ‘x3’); INSERT INTO els (id, pid, name) VALUES (7, 6, ‘w2’); INSERT INTO els (id, pid, name) VALUES (8, 6, ‘w1’); INSERT INTO els (id, pid, name) VALUES (9, 7, ‘z1’); INSERT INTO els (id, pid, name) VALUES (10, 7, ‘z2’);
Tree
top
|-x1
| |-y1
| |-y2
|-x2
|-x3
|-w1
|-w2
|-z1
|-z2
We can write SQL query to get all children of element x3 (id=6):
WITH RECURSIVE
els_cte(id,pid,name) AS (
SELECT id,pid,name
FROM els
WHERE pid=6
UNION ALL
SELECT x.id,x.pid,x.name
FROM els AS x
INNER JOIN els_cte AS y ON (x.pid=y.id)
)
SELECT id,pid,name
FROM els_cte;
Results are:
7 6 w2
8 6 w1
9 7 z1
10 7 z2