See https://sqlite.org/lang_with.html
which includes how to traverse the recursive tree in either depth-first or
breadth-first order.
Why do you need the closure table at all?
create table folders
(
id integer primary key,
parent_id integer references folders,
name text not null collate nocase,
check (not (parent_id is null and id != 1))
);
insert into folders values (1, null, 'Folder1'),
(2, 1, 'Folder2'),
(3, 1, 'Folder3'),
(4, 1, 'Folder4'),
(5, 2, 'Folder5'),
(6, 2, 'Folder6');
.head on
.mode column
.width 30 9 38
-- depth first
with foo (id, parent_id, name, level, path)
as (select folders.*, 0, folders.name
from folders
where parent_id is null
union all
select folders.*, level + 1, foo.path || '\' || folders.name
from foo, folders
where folders.parent_id = foo.id
order by 4
)
select substr(' ', 1, (level - 1) * 4) || name as Folder,
coalesce(parent_id, 0) as PARENT_ID,
path as FullPath
from foo;
-- breadth first
with foo (id, parent_id, name, level, path)
as (select folders.*, 0, folders.name
from folders
where parent_id is null
union all
select folders.*, level + 1, foo.path || '\' || folders.name
from foo, folders
where folders.parent_id = foo.id
order by 4 desc
)
select substr(' ', 1, (level - 1) * 4) || name as Folder,
coalesce(parent_id, 0) as PARENT_ID,
path as FullPath
from foo;
SQLite version 3.27.0 2019-01-28 00:42:06
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> create table folders
...> (
...> id integer primary key,
...> parent_id integer references folders,
...> name text not null collate nocase,
...> check (not (parent_id is null and id != 1))
...> );
sqlite>
sqlite> insert into folders values (1, null, 'Folder1'),
...> (2, 1, 'Folder2'),
...> (3, 1, 'Folder3'),
...> (4, 1, 'Folder4'),
...> (5, 2, 'Folder5'),
...> (6, 2, 'Folder6');
sqlite> .head on
sqlite> .mode column
sqlite> .width 30 9 38
sqlite>
sqlite> -- depth first
sqlite>
sqlite> with foo (id, parent_id, name, level, path)
...> as (select folders.*, 0, folders.name
...> from folders
...> where parent_id is null
...> union all
...> select folders.*, level + 1, foo.path || '\' || folders.name
...> from foo, folders
...> where folders.parent_id = foo.id
...> order by 4
...> )
...> select substr(' ', 1, (level - 1) * 4) || name as
Folder,
...> coalesce(parent_id, 0) as PARENT_ID,
...> path as FullPath
...> from foo;
Folder PARENT_ID FullPath
------------------------------ ---------
--------------------------------------
Folder1 0 Folder1
Folder2 1 Folder1\Folder2
Folder3 1 Folder1\Folder3
Folder4 1 Folder1\Folder4
Folder5 2 Folder1\Folder2\Folder5
Folder6 2 Folder1\Folder2\Folder6
sqlite>
sqlite>
sqlite> -- breadth first
sqlite>
sqlite> with foo (id, parent_id, name, level, path)
...> as (select folders.*, 0, folders.name
...> from folders
...> where parent_id is null
...> union all
...> select folders.*, level + 1, foo.path || '\' || folders.name
...> from foo, folders
...> where folders.parent_id = foo.id
...> order by 4 desc
...> )
...> select substr(' ', 1, (level - 1) * 4) || name as
Folder,
...> coalesce(parent_id, 0) as PARENT_ID,
...> path as FullPath
...> from foo;
Folder PARENT_ID FullPath
------------------------------ ---------
--------------------------------------
Folder1 0 Folder1
Folder2 1 Folder1\Folder2
Folder5 2 Folder1\Folder2\Folder5
Folder6 2 Folder1\Folder2\Folder6
Folder3 1 Folder1\Folder3
Folder4 1 Folder1\Folder4
sqlite>
---
The fact that there's a Highway to Hell but only a Stairway to Heaven says a
lot about anticipated traffic volume.
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users