2014-12-05 57 views
1

我有下列表结构存储文件和文件夹层次结构。使用公用表表达式进行递归自底向上查询

FolderInfo

Id (key) 
Name 
ParentFolderId (nullable) 

File

FileId(key) 
FileName 
FolderId 

FolderInfo表中有一个ParentFolderId这是一个外键,它自己的ID。根文件夹在ParentFolderId中有一个空值,所有其他记录通过它来引用它们的父记录。 我想生成一个结果,其中包含所选文件及其遍历层次结构的完整路径。

结果

File 
Location 

我需要做到这一点使用一些聪明的T-SQL。如果有人能够显示基于公用表表达式的方法来递归地遍历层次结构,

回答

4

为了让你将使用形式的递归CTE的单个文件的路径: with folderPath as ( select Id, ParentFolderId, Name from FolderInfo where Id = @FileFolderId union all select p.Id, p.ParentFolderId, p.Name from folderPath p join FolderInfo fi on fi.Id = p.ParentFolderId ) select @FullFolderPath += '/' +Name from folderPath 其中@FileFolderId是你想为路径的文件ID值,并且@FullFolderPath是VARCHAR(8000)变量汇总路径。

这将为您提供一个良好的开始,但它可能需要一些调整。

+0

感谢Kerneels的快速帮助。虽然你的代码并没有完全回答我的问题,但它给了我一个深入的尝试并得出结论的见解。通过这个我意识到我的问题存在一个基本问题。我想实现的结果不能通过公共表表达式来实现。事实上,我想要从底层到顶层的分层结构,但CTE只能从上到下或者深入报告。我的数据已经以钻取报告的形式出现,我想要实现的是将所有数据融合在一起。我现在会写一个例程来实现这一点。 – dhruvin 2014-12-08 04:50:43

+0

感谢您接受我的回答@dhruvin。你确定你关于CTE的陈述不能做自下而上的遍历吗?它真的不会觉得自下而上或自顶向下遍历会有很大差异。事实上,假设结果集是自下而上的,那么可以简单地聚集不同的路径,即'@FullPath = Name +'/'+ @ FullPath'这样预先而不是附加。另外,如果您稍微调整CTE会​​发生什么情况,也许会找到一种方法使递归逃逸子句为ParentFolderId,它应该为空,以便爬到满足的位置? – 2014-12-08 06:28:57

+0

或者,你可以探索加入diferenctly对CTE的影响:'fi.ParentFolderId = p.Id',但我在猜测。递归CTE非常强大。 – 2014-12-08 06:31:38