Looking at this approach of a hierarchical system: https://coderwall.com/p/lixing/closure-tables-for-browsing-trees-in-sql
Given a table like this: ID PARENT_ID FOLDER RANK --------------------------------------------------------------- 1 0 Main 000000001 2 1 CC 000000001-0000000002 3 1 BB 000000001-0000000003 4 1 AA 000000001-0000000004 5 2 B 000000001-0000000002-0000000005 6 2 A 000000001-0000000002-0000000006 What SQL should I use to update the field RANK if the first row is known to be 0000000001, but all the next rows are null? I tried with a non-recursive query, but couldn't work it out. RBS On Thu, Jan 31, 2019 at 8:02 AM Bart Smissaert <bart.smissa...@gmail.com> wrote: > This looks a nice and simple way to display the tree in the right order > without recursive SQL: > > https://coderwall.com/p/lixing/closure-tables-for-browsing-trees-in-sql > > Will do some testing on large numbers to see how the 2 methods compare > speed-wise. > > RBS > > On Tue, Jan 29, 2019 at 8:33 PM Keith Medcalf <kmedc...@dessus.com> wrote: > >> >> 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 >> 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