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
我对引用服务器上文件的 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