我正在使用SQL Server 2005,我有一个名为Docs
的表,其中有一列叫做Path
。分层SQL查询
Path
列包含文件路径:
"C:\MyDocs\1.txt"
"C:\MyDocs\Folder1\3.txt"
我需要我的查询在一个查询中许多孩子的每个文件夹和子怎么也来检索。
在我的例子上面我所需要的查询检索:
3名儿童(1个文件夹和2个文件) “MyDocs” 1名儿童(1个文件) “Folder1中”。
任何想法?
谢谢。
我正在使用SQL Server 2005,我有一个名为Docs
的表,其中有一列叫做Path
。分层SQL查询
Path
列包含文件路径:
"C:\MyDocs\1.txt"
"C:\MyDocs\Folder1\3.txt"
我需要我的查询在一个查询中许多孩子的每个文件夹和子怎么也来检索。
在我的例子上面我所需要的查询检索:
3名儿童(1个文件夹和2个文件) “MyDocs” 1名儿童(1个文件) “Folder1中”。
任何想法?
谢谢。
就可以解决这个使用字符串操作为清楚起见,二热膨胀系数:
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
未测试!
您需要将路径拆分为单独的字符串并对数据进行规范化。这里是一个previous question分裂字符串在SQL中。
完成之后,您可以使用Recursive CTE来获取数据。
添加一个包含目录路径的列目录(例如“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
我没有运行查询,但想法应该清楚。
这不是查询的工作。拉动您需要的记录子集并在应用程序中执行这种类型的处理会容易得多且效率更高。 .Net框架的Directory类可以简化这个工作。 – Britchie 2011-05-15 13:52:19
为什么这不是查询的工作?如果您拥有数千个目录和数百万个文件,那么获取所有路径并在应用程序中处理它们将是疯狂的。 – mabn 2011-05-15 14:11:41