SQL 树形文件结构 - 获取文件路径

SQL Tree Filestructure - get filepath

我对引用服务器上文件的 MSSQLServer 数据库具有只读访问权限。

两个表用于表示文件结构:

folderInfo
-------------------------------------------------
|  id  |  parentId  |  Sequence |  folderName   | 
|------------------------------------------------
|  1   |      0     |     1     |     folder1   |
|  2   |      0     |     2     |     folder2   |
|  3   |      1     |     1     |   subfolder1  |
-------------------------------------------------

fileInfo
-----------------------------------------------
|  id  |  folderId    |  Sequence | fileName  | 
|----------------------------------------------
|  1   |      3       |      1    |  e.xml    |
|  2   |      2       |      1    |  a.xml    |
|  3   |      2       |      2    |  f.xml    |
-----------------------------------------------

"parentId=0"表示该文件夹在文件结构的根目录。

我不知道如何查询所有文件,联合能够给我文件路径(相对于根目录)。

鉴于文件数量的数量级是10000,我不想为每个文件都重新查询(或者我认为这是低效的是我错了吗?)。

我在 post 中找到了答案的开头:

with recursive full_tree as (
  select id, name, parent, 1 as level
  from departments
  where parent is null
  union all 
  select c.id, c.name, c.parent, p.level + 1
  from departments c
    join full_tree p on c.parent = p.id
)
select *
from full_tree;

但我不知道怎样才能把它变成我需要的东西,就像这样:

fileInfo
----------------------------------------------------
|  id  |  Sequence | filepath                      | 
|---------------------------------------------------
|  1   |      1    |  /folder1/subfolder1/e.xml    |
|  2   |      1    |  /folder2/a.xml               |
|  3   |      2    |  /folder2/f.xml               |
----------------------------------------------------

像这样

Declare @FolderInfo table (id int,parentId int,Sequence int, folderName varchar(100))
Insert into @FolderInfo values (1,0,1,'folder1'),(2,0,2,'folder2'),(3,1,1,'subfolder1')

Declare @FileInfo table (id int,folderId int,Sequence int, fileName varchar(100))
Insert into @FileInfo values (1 ,3 ,1,'e.xml'),(2 ,2 ,1,'a.xml'),(3 ,2 ,2,'f.xml')

;with cteHB (Seq,ID,parentId,Lvl,folderPath) as (
    Select  Seq  = cast(1000+Row_Number() over (Order by folderName) as varchar(500))
           ,ID
           ,parentId
           ,Lvl=1
           ,folderPath = cast('/'+folderName as varchar(500))
     From   @FolderInfo 
     Where  parentId = 0
     Union  All
     Select Seq  = cast(concat(cteHB.Seq,'.',1000+Row_Number() over (Order by cteCD.Sequence)) as varchar(500))
           ,cteCD.ID
           ,cteCD.parentId,cteHB.Lvl+1
           ,folderPath = cast(concat(cteHB.folderPath,'/',cteCD.folderName ) as varchar(500))
     From   @FolderInfo cteCD 
     Join   cteHB on cteCD.parentId = cteHB.ID)
Select B.ID
      ,B.Sequence
      ,folderPath=A.folderPath+'/'+B.fileName
 From cteHB A
 Join @FileInfo B on (B.folderId =A.ID)
 Order By A.Seq             

Returns

ID  Sequence    folderPath
1   1           /folder1/subfolder1/e.xml
2   1           /folder2/a.xml
3   2           /folder2/f.xml