返回基于 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另一个文件夹中包含的所有文件夹
例如megaSubfolder
、subfolder2.1
、subfolder2.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" 行到先前已选择的行。
结果包括 5
的 id
行。如果不需要,请在 SELECT * FROM search_path
后添加 WHERE id <> 5
。
我偶然发现了一个非常可怕的问题,这是我的 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另一个文件夹中包含的所有文件夹
例如megaSubfolder
、subfolder2.1
、subfolder2.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" 行到先前已选择的行。
结果包括 5
的 id
行。如果不需要,请在 SELECT * FROM search_path
后添加 WHERE id <> 5
。