SQL文件和路径名的递归连接

时间:2018-02-16 16:27:37

标签: sql recursion hierarchy

我无法绕过这个...我在SQL Server中有3个相关的表:

FileIds

  Id
  FileName

FolderIds

  Id
  ParentId
  FolderName

的FileInfo

  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

的FileInfo

  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)我需要创建一个显示的视图完整的路径...很容易将这些部分放在C#等代码中,但我似乎无法弄清楚如何在SQL中完成它。我已经查找了SQL Server的递归CTE,而我却没有得到它。

1 个答案:

答案 0 :(得分:0)

这应该允许你开始使用递归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