2015-05-09 45 views
1

我偶然發現了一個很可怕的問題斷言,這裏是我的表返回條目包含與SQL

filesystem (id, name, parentid); 

,爲例如

(1, 'root', null) 

(2, 'folder1', 1) 
(3, 'subfolder1.1', 2) 
(4, 'subfolder1.2', 2) 

(5, 'folder2', 1) 
(6, 'subfolder2.1', 5) 
(7, 'subfolder2.2', 5) 
(8, 'megaSubfolder', 6) 

是留給我們的某些條目以下路徑:

root 
root/folder1 
root/folder2 
root/folder1/subfolder1.1 
root/folder1/subfolder1.2 
root/folder2/subfolder2.1 
root/folder2/subfolder2.2 
root/folder2/subfolder2.1/megaSubfolder 

我想要的是選擇所有包含在另一個文件夾中

例如megaSubfoldersubfolder2.1subfolder2.2包含在folder2(ID )

我應該如何寫請求作爲返回這些3項(ID ,, )例如謂詞是?

+0

遞歸CTE會這麼做 – cha

+2

這是一樣的你前面的問題:http://stackoverflow.com/questions/30136626/how-to-make-a-sql-loop只是一個不同的起始條件 –

回答

2

你可以這樣說:

WITH RECURSIVE search_path(id, name) AS (
     SELECT f.id, f.name 
     FROM filesystem f 
     WHERE id=5 
     UNION ALL 
     SELECT f.id, f.name 
     FROM filesystem f 
     JOIN search_path sf ON f.parentid=sf.id 
) 
SELECT * FROM search_path; 

UNION ALL頂端部分選擇查詢的起始行。底部將其他行連接到之前選擇的行。

結果包括5id這一行。如果你不想要,在SELECT * FROM search_path之後加WHERE id <> 5

Demo.

+0

感謝,很好地工作,有沒有辦法將它用作視圖?並在視圖的進一步請求中提供該id作爲參數?這將是有趣的 – user544262772

+0

@발렌텐我不認爲你可以從這個角度出發,因爲出發點會有所不同。你可以建立一個視圖,爲你的樹提供一個傳遞閉包,但是它會很大並且很難處理。 – dasblinkenlight

+0

好的感謝您的額外信息 – user544262772