SQL 文件和路径名的递归连接
SQL Recursive concatenation of a file and path name
我实在想不通...我在 SQL 服务器中有 3 个相关表:
FileIds
Id
FileName
FolderIds
Id
ParentId
FolderName
文件信息
Id
FolderId
FileId
FileAuthorId
FileClientId
示例数据:
FileIds
1, Gartner
2, Parker
3, Stepp
FolderIds
1, null, Georgia
2, 1, Atlanta
3, 2, Terminus
4, 3, Suite 1500
5, 4, David Williams
6, 4, Lisa Davidson
7, 2, LaGrange
8, 7, Dena Pressley
文件信息
1, 8, 1, null, null
2, 5, 2, null, null
3, 6, 3, null null
视图中的示例输出:
Georgia.Atlanta.LaGrange.Dena Pressley:Gartner, null, null
Georgia.Atlanta.Terminus.Suite 1500.David Williams:Parker, null, null
Georgia.Atlanta.Terminus.Suite 1500.Lisa Davidson:Stepp, null, null
虽然这不是一个文件目录,但它的布局就像一个(将 .'s 和 :'s 替换为 \'s),我需要创建一个显示完整路径的视图......它在 C# 之类的代码中很容易将各个部分组合在一起,但我似乎无法弄清楚 SQL 中如何进行。我已经查看了 SQL 服务器的递归 CTE,但我就是不明白。
这应该允许您开始使用递归 CTE:
这里我只添加文件夹,但你可以完全一样,在另一个 CTE 中添加文件
WITH folders (Id, ParentId, FolderName)
AS (
-- In here you select the first LEVEL
SELECT Id, ParentId, FolderName FROM FolderIds
WHERE ParentId IS NULL
UNION ALL
-- In here you join the previous LEVEL with new relative LEVELS
SELECT b.Id, b.ParentId, a.FolderName CONCAT ' ' CONCAT b.FolderName
FROM folders a
INNER JOIN FolderIds b
ON a.Id = b.ParentId
)
SELECT *
FROM folders
我实在想不通...我在 SQL 服务器中有 3 个相关表:
FileIds
Id
FileName
FolderIds
Id
ParentId
FolderName
文件信息
Id
FolderId
FileId
FileAuthorId
FileClientId
示例数据:
FileIds
1, Gartner
2, Parker
3, Stepp
FolderIds
1, null, Georgia
2, 1, Atlanta
3, 2, Terminus
4, 3, Suite 1500
5, 4, David Williams
6, 4, Lisa Davidson
7, 2, LaGrange
8, 7, Dena Pressley
文件信息
1, 8, 1, null, null
2, 5, 2, null, null
3, 6, 3, null null
视图中的示例输出:
Georgia.Atlanta.LaGrange.Dena Pressley:Gartner, null, null
Georgia.Atlanta.Terminus.Suite 1500.David Williams:Parker, null, null
Georgia.Atlanta.Terminus.Suite 1500.Lisa Davidson:Stepp, null, null
虽然这不是一个文件目录,但它的布局就像一个(将 .'s 和 :'s 替换为 \'s),我需要创建一个显示完整路径的视图......它在 C# 之类的代码中很容易将各个部分组合在一起,但我似乎无法弄清楚 SQL 中如何进行。我已经查看了 SQL 服务器的递归 CTE,但我就是不明白。
这应该允许您开始使用递归 CTE:
这里我只添加文件夹,但你可以完全一样,在另一个 CTE 中添加文件
WITH folders (Id, ParentId, FolderName)
AS (
-- In here you select the first LEVEL
SELECT Id, ParentId, FolderName FROM FolderIds
WHERE ParentId IS NULL
UNION ALL
-- In here you join the previous LEVEL with new relative LEVELS
SELECT b.Id, b.ParentId, a.FolderName CONCAT ' ' CONCAT b.FolderName
FROM folders a
INNER JOIN FolderIds b
ON a.Id = b.ParentId
)
SELECT *
FROM folders