That should of course be:

with folderpath(id, rightmost_folder_id, parent_id, path, rank) 
  as (
      select id, id, parent_id, name, rank 
        from folders
     union all
      select f.id, fp.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;

to propogate the rightmost_folder_id from the rightmost (first) folders tuple 
...

---
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-
>[email protected]] On Behalf Of Keith Medcalf
>Sent: Monday, 13 May, 2019 19:46
>To: SQLite mailing list
>Subject: Re: [sqlite] CTE to Get Path In a Tree
>
>
>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-
>>[email protected]] 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 <[email protected]>
>>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
>>> [email protected]
>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-
>>users
>>>
>>_______________________________________________
>>sqlite-users mailing list
>>[email protected]
>>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
>
>
>_______________________________________________
>sqlite-users mailing list
>[email protected]
>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to