我使用的是SQL Server 2005,我有一个名为Docs
的表,其中一列名为Path
。
Path
列包含文件路径:
"C:\MyDocs\1.txt"
"C:\MyDocs\Folder1\3.txt"
我需要查询在单个查询中检索每个文件夹和子文件夹有多少个子项。
在上面的示例中,我需要查询来检索:
“MyDocs”的3个孩子(1个文件夹和2个文件) 1个孩子(1个文件)为“Folder1”。
有什么想法吗?
谢谢。
答案 0 :(得分:2)
添加带目录路径的列目录(例如“C:\ MyDocs \ Folder1 \ 3.txt”,它应包含“C:\ MyDocs \ Folder1 \”)。然后:
select dirs.path, count(*) from Docs files
join (select distinct dir as path from Docs) dirs
on (files.dir like dirs.path + '%')
group by dirs.path
我没有运行查询,但想法应该清楚。
答案 1 :(得分:1)
您需要将路径拆分为单独的字符串并规范化数据。这是sql中拆分字符串的previous question。
完成后,您可以使用Recursive CTE获取数据。
答案 2 :(得分:0)
您可以使用字符串操作解决此问题,为清楚起见,可以使用两个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
未经测试!