分层SQL查询

时间:2011-05-15 13:45:42

标签: sql sql-server-2005

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

Path列包含文件路径:

"C:\MyDocs\1.txt"
"C:\MyDocs\Folder1\3.txt"

我需要查询在单个查询中检索每个文件夹和子文件夹有多少个子项。

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

“MyDocs”的3个孩子(1个文件夹和2个文件) 1个孩子(1个文件)为“Folder1”。

有什么想法吗?

谢谢。

3 个答案:

答案 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

未经测试!