I may be missing something, but with recursive CTE's, why do you need the 
second table? I'm assuming it's just to speed things up once the counts get 
large?


sqlite> create table folders (id integer primary key, parent_id int references 
folders, name text not null collate nocase, check (not (parent_id is null and 
id != 1)));
QUERY PLAN
`--SEARCH TABLE sqlite_master USING INTEGER PRIMARY KEY (rowid=?)


sqlite> insert into folders values (1, null, 'Folder1'), (2, 1, 'Folder2'), (3, 
1, 'Folder3'), (4, 1, 'Folder4'), (5, 2, 'Folder5'), (6, 2, 'Folder6');
QUERY PLAN
|--SCAN 6 CONSTANT ROWS
`--SCAN TABLE folders


Gonna use backslashes here rather than spaces. So admitidly not exactly what 
you were looking for. But some playing around with string functions should be 
able to get there.


sqlite> with recursive foo (id, parent_id, name) as (select * from folders 
where id = 1 union all select folders.id, folders.parent_id, foo.name || '\' || 
folders.name from folders inner join foo on folders.parent_id = foo.id) select 
* from foo order by name;
QUERY PLAN
|--CO-ROUTINE 2
|  |--SETUP
|  |  `--SEARCH TABLE folders USING INTEGER PRIMARY KEY (rowid=?)
|  `--RECURSIVE STEP
|     |--SCAN TABLE foo
|     `--SEARCH TABLE folders USING AUTOMATIC COVERING INDEX (parent_id=?)
|--SCAN SUBQUERY 2
`--USE TEMP B-TREE FOR ORDER BY
id|parent_id|name
1||Folder1
2|1|Folder1\Folder2
5|2|Folder1\Folder2\Folder5
6|2|Folder1\Folder2\Folder6
3|1|Folder1\Folder3
4|1|Folder1\Folder4


-----Original Message-----
From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] On 
Behalf Of Bart Smissaert
Sent: Tuesday, January 29, 2019 10:52 AM
To: General Discussion of SQLite Database
Subject: [sqlite] Displaying hierarchical structure

Working on an Android app and part of that is storing SQL in a virtual
folder system in SQLite. For this I want to use a so-called closure table
as explained nicely here:

http://technobytz.com/closure_table_store_hierarchical_data.html

I have a table holder the folder details:

ID PARENT_ID Folder

-------------------------------------
1  0               Folder1
2  1               Folder2
3  1               Folder3
4  1               Folder4
5  2               Folder5
6  2               Folder6


And then the closure table:

PARENT_ID CHILD_ID DEPTH

-----------------------------------------------
1                   1            0
2                   2            0
3                   3            0
4                   4            0
5                   5            0
6                   6            0
1                   2            1
1                   3            1
1                   4            1
2                   5            1
1                   5            2
2                   6            1
1                   6            2

What should the SQL be to display the folders like this:

Folder        PARENT_ID
Folder1       0
Folder2       1
    Folder5   2
    Folder6   2
Folder3       1
Folder4       1


RBS
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to