如何使用 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
,字段:
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 在数据库中检测具有嵌套关系的父级?的主要内容,如果未能解决你的问题,请参考以下文章