返回基于 sql 的包含谓词的条目

returning entries based on a is contained predicate with sql

我偶然发现了一个非常可怕的问题,这是我的 table

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

我想要的是select另一个文件夹中包含的所有文件夹

例如megaSubfoldersubfolder2.1subfolder2.2都包含在folder2 (id 5)

关于return这3个条目(id 8, 7, 6) 其中谓词是 5 例如 ?

你可以这样做:

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 的顶部选择查询的起始行。底部 "connects" 行到先前已选择的行。

结果包括 5id 行。如果不需要,请在 SELECT * FROM search_path 后添加 WHERE id <> 5

Demo.