Assuming "right folder id" is short-hand for "the id of the rightmost folder" ...
with folderpath(id, rightmost_folder_id, parent_id, path, rank) as ( select id, rightmost_folder_id, parent_id, name, rank from folders union all select f.id, rightmost_folder_id, f.parent_id, f.name || '/' || fp.path, fp.rank from folders f join folderpath fp on (f.id == fp.parent_id) ) select rightmost_folder_id, path from folderpath where id == 1 order by rank; --- The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume. >-----Original Message----- >From: sqlite-users [mailto:sqlite-users- >boun...@mailinglists.sqlite.org] On Behalf Of Bart Smissaert >Sent: Monday, 13 May, 2019 15:22 >To: SQLite mailing list >Subject: Re: [sqlite] CTE to Get Path In a Tree > >Have the same table structure to represent a folder tree: > >CREATE TABLE FOLDERS([ID] INTEGER PRIMARY KEY, [PARENT_ID] INTEGER, >[NAME] >TEXT, [LEVEL] INTEGER, [RANK] TEXT) > >Data is as follows: > >ID PARENT_ID NAME LEVEL RANK >--------------------------------------------------------------------- >---------------------- >1 0 Main 0 0 >2 1 Diabetic audit 1 0000000001-0000000002 >3 1 GROUP BY 1 0000000001-0000000003 >4 1 xxxxx 1 0000000001-0000000004 >8 1 Common 1 0000000001-0000000008 >9 3 zzz 2 0000000001-0000000003-0000000009 >10 9 yyy 3 0000000001-0000000003-0000000009-0000000010 > >Now I would like the following output: >In first column the ID of the folder and in the second column the >full path >of that folder. > >This will give the right ID's and the right folders in the right >order by >doesn't give the full path: > >select f.id, f.name as name from folders f where f.id in >(with recursive branch(id) as (select id from folders where id = 1 >union all >select f.id from folders f inner join branch b on(f.parent_id = >b.id)) >select id from branch) >order by rank > >This will give the right full paths in the right order but doesn't >give me >the right folder ID (1 for all rows): > >with recursive folderpath(id, parent_id, path, rank) as >(select id, parent_id, name, rank from folders >union all >select f.id, f.parent_id, f.name || '/' || fp.path, fp.rank from >folders f >inner join folderpath fp on (f.id = fp.parent_id)) >select id, path from folderpath where id = 1 order by rank > >How do I get the right folder ID and the full paths? > >RBS > >On Sun, May 12, 2019 at 1:15 PM Igor Tandetnik <i...@tandetnik.org> >wrote: > >> On 5/12/2019 6:19 AM, Philip Bennefall wrote: >> > Hi everyone, >> > >> > I have a tree of folders and I want to find the complete path >from any >> arbitrary point back to the top level directory. The schema is: >> > >> > CREATE TABLE IF NOT EXISTS folders( >> > id INTEGER PRIMARY KEY, >> > parentFolderId INTEGER REFERENCES folders(id) ON DELETE >CASCADE ON >> UPDATE CASCADE, >> > name TEXT NOT NULL); >> > >> > I made the following CTE: >> > >> > WITH RECURSIVE folderTree (id, path) >> > AS(SELECT id, name FROM folders WHERE parentFolderId IS NULL >> > UNION ALL >> > SELECT folders.id, folderTree.path || '/' || folders.name >> > FROM folders, folderTree WHERE folders.parentFolderId = >folderTree.id) >> > SELECT path FROM folderTree WHERE id=?1; >> > >> > This produces the correct result, but I am wondering if there is >a more >> efficient way? This query seems to generate the entire tree and >then do a >> table scan to find just the one row I am looking for. Can I start >from the >> given row and *only* traverse upwards through the levels until I >find a >> node with no parent? >> >> Just reverse the conditions. Something like this (not tested): >> >> WITH RECURSIVE folderPath(id, parentId, path) >> AS(SELECT id, parentFolderId, name FROM folders WHERE id=?1) >> UNION ALL >> SELECT f.id, f.parentFolderId, f.name || '/' || fp.path >> FROM folders f join folderPath fp on (f.id = fp.parentId)) >> SELECT path FROM folderPath WHERE parentId is null; >> >> -- >> Igor Tandetnik >> >> >> _______________________________________________ >> 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 _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users