2011-05-15 173 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 

我沒有運行查詢,但想法應該清楚。