SQL 服务器 table 具有递归文件夹路径
SQL server table with recursive folder paths
我有 table 个文档和文件夹,我想将其转换为路径列表,但 table 看起来像这样
DocumentId, Name, IsFolder
1, Test.doc, 0
2, Test2.doc, 0
3, FolderA, -1
4, Test3.doc, 0
5, FolderB, -1
6, SubFolder1, -1
7, SubFolder2, -1
和另一个 table 的关系在
ChildId, ParentId
1, 6
2, 6
4, 7
6, 3
7, 5
所以,我想要这样的文档输出
Document, Path
Test.doc, FolderA\SubFolder1
Test2.doc, FolderA\SubFolder1
Test3.doc, FolderB\SubFolder2
是否可以递归循环每个文档并生成一个字符串作为该文档的完整文件夹路径?
您可以按如下方式使用 CTE:
DECLARE @Documents TABLE (
DocumentId INT,
Name NVARCHAR(MAX),
IsFolder BIT
)
INSERT @Documents
VALUES
(1, 'Test.doc', 0)
,(2, 'Test2.doc', 0)
,(3, 'FolderA', -1)
,(4, 'Test3.doc', 0)
,(5, 'FolderB', -1)
,(6, 'SubFolder1', -1)
,(7, 'SubFolder2', -1)
DECLARE @Relation TABLE (
ParentId INT,
ChildId INT
)
INSERT @Relation
VALUES
(1, 6)
,(2, 6)
,(4, 7)
,(6, 3)
,(7, 5);
WITH CTE AS (
SELECT D.Name AS Path, D.DocumentId ChildId, D.IsFolder FROM @Documents D
WHERE NOT EXISTS (SELECT * FROM @Relation R2 WHERE R2.ParentId = D.DocumentId)
UNION ALL
SELECT C.Path + '\' + D.Name AS Path, D.DocumentId ChildId, D.IsFolder FROM @Documents D
CROSS JOIN CTE C
WHERE EXISTS (SELECT * FROM @Relation R WHERE C.ChildId = R.ChildId AND R.ParentId = D.DocumentId)
)
SELECT Path FROM CTE WHERE CTE.IsFolder = 0
输出如下:
FolderB\SubFolder2\Test3.doc
FolderA\SubFolder1\Test.doc
FolderA\SubFolder1\Test2.doc
我有 table 个文档和文件夹,我想将其转换为路径列表,但 table 看起来像这样
DocumentId, Name, IsFolder
1, Test.doc, 0
2, Test2.doc, 0
3, FolderA, -1
4, Test3.doc, 0
5, FolderB, -1
6, SubFolder1, -1
7, SubFolder2, -1
和另一个 table 的关系在
ChildId, ParentId
1, 6
2, 6
4, 7
6, 3
7, 5
所以,我想要这样的文档输出
Document, Path
Test.doc, FolderA\SubFolder1
Test2.doc, FolderA\SubFolder1
Test3.doc, FolderB\SubFolder2
是否可以递归循环每个文档并生成一个字符串作为该文档的完整文件夹路径?
您可以按如下方式使用 CTE:
DECLARE @Documents TABLE (
DocumentId INT,
Name NVARCHAR(MAX),
IsFolder BIT
)
INSERT @Documents
VALUES
(1, 'Test.doc', 0)
,(2, 'Test2.doc', 0)
,(3, 'FolderA', -1)
,(4, 'Test3.doc', 0)
,(5, 'FolderB', -1)
,(6, 'SubFolder1', -1)
,(7, 'SubFolder2', -1)
DECLARE @Relation TABLE (
ParentId INT,
ChildId INT
)
INSERT @Relation
VALUES
(1, 6)
,(2, 6)
,(4, 7)
,(6, 3)
,(7, 5);
WITH CTE AS (
SELECT D.Name AS Path, D.DocumentId ChildId, D.IsFolder FROM @Documents D
WHERE NOT EXISTS (SELECT * FROM @Relation R2 WHERE R2.ParentId = D.DocumentId)
UNION ALL
SELECT C.Path + '\' + D.Name AS Path, D.DocumentId ChildId, D.IsFolder FROM @Documents D
CROSS JOIN CTE C
WHERE EXISTS (SELECT * FROM @Relation R WHERE C.ChildId = R.ChildId AND R.ParentId = D.DocumentId)
)
SELECT Path FROM CTE WHERE CTE.IsFolder = 0
输出如下:
FolderB\SubFolder2\Test3.doc
FolderA\SubFolder1\Test.doc
FolderA\SubFolder1\Test2.doc