2015-05-09 87 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