sql - 返回基于 a 的条目包含带有 sql 的谓词

标签 sql postgresql recursion predicate

<分区>

我偶然发现了一个非常可怕的问题,这是我的 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

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

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

我应该如何编写返回这 3 个条目(id 876)的请求,其中谓词是 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 的顶部选择查询的起始行。底部部分将额外的行“连接”到之前选择的行。

结果包括带有 id 的行的 5 .如果您不想要它,请添加 WHERE id <> 5SELECT * FROM search_path 之后.

Demo.

关于sql - 返回基于 a 的条目包含带有 sql 的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30140483/

相关文章:

c++ - 需要帮助使用递归将文本文件中的信息输入到结构中吗?

c# - 我已经插入了一行,我想获取它的 ID 并加上一个 int 并插入到该行中

sql - django 模型 : get list of id

ruby-on-rails - 如何根据事件记录中的 `updated_at` 列仅检索更新的记录

postgresql - 错误 : missing FROM-clause entry for table "new"

python - C++ 或 Python 中字符串所有排列的算法

php - MySQL 查询对 GROUP BY 中的结果进行排序

sql - 带 in 子句的查询中的参数?

postgresql - 数据库触发器限制 Postgres 中的最大表大小

java - 使用递归找到迷宫中的最短路径?