2011-05-15 125 views
1

我正在使用SQL Server 2005,我有一个名为Docs的表,其中有一列叫做Path分层SQL查询

Path列包含文件路径:

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

我需要我的查询在一个查询中许多孩子的每个文件夹和子怎么也来检索。

在我的例子上面我所需要的查询检索:

3名儿童(1个文件夹和2个文件) “MyDocs” 1名儿童(1个文件) “Folder1中”。

任何想法?

谢谢。

+1

这不是查询的工作。拉动您需要的记录子集并在应用程序中执行这种类型的处理会容易得多且效率更高。 .Net框架的Directory类可以简化这个工作。 – Britchie 2011-05-15 13:52:19

+0

为什么这不是查询的工作?如果您拥有数千个目录和数百万个文件,那么获取所有路径并在应用程序中处理它们将是疯狂的。 – mabn 2011-05-15 14:11:41

回答

0

就可以解决这个使用字符串操作为清楚起见,二热膨胀系数:

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 

未测试!

+0

谢谢迈克尔,我如何显示每个文件夹中的文件名称,而不仅是他们的数量? – Gil 2011-05-16 09:12:09

+0

我已更新我的示例以尝试回答您的问题。 – Lumi 2011-05-16 13:00:14

1

您需要将路径拆分为单独的字符串并对数据进行规范化。这里是一个previous question分裂字符串在SQL中。

完成之后,您可以使用Recursive CTE来获取数据。

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 

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