我正在使用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