如何使用 SQL 在数据库中检测具有嵌套关系的父级?

Posted

技术标签:

【中文标题】如何使用 SQL 在数据库中检测具有嵌套关系的父级?【英文标题】:How can you detect a parent with a nested relationship in a database using SQL? 【发布时间】:2011-09-28 23:05:26 【问题描述】:

我使用的是 Firebird 2.1。有一个表名Folders,字段:

文件夹 ID 父文件夹ID 文件夹名称

ParentFolderID 如果是根文件夹,则为 -1 -- 否则它包含父文件夹的 ID。

如何找到低级节点的所有父节点(直到根文件夹)?

我需要递归查询吗? (Firebird supports them)

【问题讨论】:

@OMG Ponies:试试英文网站 :) pabloj.blogspot.com/2008/01/new-challenges-new-synthax.html @ypercube: Je ne comprende pas :p 【参考方案1】:

类似这样的:

WITH RECURSIVE hierarchy (folderid, ParentFolderId, FolderName) as (
   SELECT folderid, ParentFolderId, FolderName
   FROM folders
   WHERE ParentFolderID = -1

   UNION ALL

   SELECT folderid, ParentFolderId, FolderName
   FROM folders f
     JOIN hierarchy p ON p.folderID = f.parentFolderID
)
SELECT *
FROM hierarchy

编辑:以下查询将“向上”遍历层次结构,查找给定文件夹的所有父级。

WITH RECURSIVE hierarchy (folderid, ParentFolderId, FolderName) as (
   SELECT folderid, ParentFolderId, FolderName
   FROM folders
   WHERE folderid = 42

   UNION ALL

   SELECT folderid, ParentFolderId, FolderName
   FROM folders f
     JOIN hierarchy p ON p.parentFolderID = f.folderID
)
SELECT *
FROM hierarchy

【讨论】:

我认为您发布的查询返回了父节点的所有子节点。您是否有查找子节点的所有父节点的查询?谢谢。 你只需要“反转”起始条件和“遍历”条件。查看我的编辑 谢谢你的作品!您能否再帮忙做一件事:我正在使用 List 命令将文件夹名称放在一个字符串中(子 2/子 1/父)。如何反转查询结果,使其看起来像:Parent / Child 1 / Child 2? 在 FB 邮件列表中查看此帖子:tech.groups.yahoo.com/group/firebird-support/message/106989

以上是关于如何使用 SQL 在数据库中检测具有嵌套关系的父级?的主要内容,如果未能解决你的问题,请参考以下文章

约束布局与嵌套滚动视图中的父级不匹配

Quasar(vue)中嵌套在路由器中的子级中的父级触发方法

三级菜单数据实现,实现嵌套三级菜单数据

三级菜单数据实现,实现嵌套三级菜单数据

从具有本机反应的父级调用子方法

如果子关系在 Laravel 中有结果,我如何只返回父级,如果关系是三重嵌套的?