分层SQL查询

分层SQL查询,sql,sql-server-2005,Sql,Sql Server 2005,我使用的是SQL Server 2005,我有一个名为Docs的表和一个名为Path的列 Path列包含文件路径: "C:\MyDocs\1.txt" "C:\MyDocs\Folder1\3.txt" 我需要查询在单个查询中检索每个文件夹和子文件夹有多少子文件夹 在上面的示例中,我需要查询来检索: “MyDocs”的3个子项(1个文件夹和2个文件) “Folder1”有1个子文件(1个文件) 有什么想法吗 谢谢。您需要将路径拆分为单独的字符串并规范化数据。下面是一个关于在sql中拆分字符串的

我使用的是SQL Server 2005,我有一个名为
Docs
的表和一个名为
Path
的列

Path
列包含文件路径:

"C:\MyDocs\1.txt"
"C:\MyDocs\Folder1\3.txt"
我需要查询在单个查询中检索每个文件夹和子文件夹有多少子文件夹

在上面的示例中,我需要查询来检索:

“MyDocs”的3个子项(1个文件夹和2个文件) “Folder1”有1个子文件(1个文件)

有什么想法吗


谢谢。

您需要将路径拆分为单独的字符串并规范化数据。下面是一个关于在sql中拆分字符串的示例


完成后,可以使用获取数据。

添加一个带有目录路径的列目录(例如,对于“C:\MyDocs\Folder1\3.txt”,它应该包含“C:\MyDocs\Folder1\”)。然后:


我没有运行查询,但想法应该很清楚。

您可以使用字符串操作解决此问题,为清楚起见,可以使用两个CTE:

WITH
R1(RevPath) as (select reverse(Path) from Docs),
R2(ParentFolder) as
(select reverse( substring(RevPath, charindex('\', RevPath), 3333)) from R1)
select ParentFolder, count(*) from R2
group by ParentFolder
go
您可能需要根据您的数据对此进行一些调整。如果您的表仅列出文件,则此查询应该可以。如果它还列出带有尾随反斜杠的文件夹,则从计数中减去1

如何获取其中包含的所有文件夹和文件的列表

WITH
R1(Path, RevPath) as (select Path, reverse(Path) from Docs),
R2(ParentFolder, Path) as
(select
  reverse( substring(RevPath, charindex('\', RevPath), 3333)),
  Path
 from R1)
select * from R2
where ParentFolder LIKE 'C:\some\folder\%' -- all folders below C:\some\folder
go

没有测试

这不是用于查询的作业。提取您需要的记录子集,并在应用程序中进行这种类型的处理,将更容易、更高效。Net framework的目录类可以很快完成这项工作。为什么这不是一个查询作业?如果你有数千个目录和数百万个文件,那么获取所有路径并在应用程序中处理它们将是愚蠢的。谢谢Michael,我如何显示每个文件夹中的文件名,而不仅仅是它们的数量?
WITH
R1(Path, RevPath) as (select Path, reverse(Path) from Docs),
R2(ParentFolder, Path) as
(select
  reverse( substring(RevPath, charindex('\', RevPath), 3333)),
  Path
 from R1)
select * from R2
where ParentFolder LIKE 'C:\some\folder\%' -- all folders below C:\some\folder
go