Sql 查询以获取数据库中树的所有祖先/后代?

Sql 查询以获取数据库中树的所有祖先/后代?,sql,perl,dbix-class,Sql,Perl,Dbix Class,我有一个表(id,parent\u id,data),其中parent\u id指向同一表中的另一行(或为空) 有没有标准的方法来查询(1)某个id的所有祖先和(2)某个id的所有后代 我也在DBIx::Class中这样做,因此,如果有一种最方便的方法可以使用该模块(或其他一些模块)来实现,我也很想听听这个 编辑:澄清-所有父项=所有祖先,所有子项=所有后代。这在很大程度上取决于您使用的SQL的风格 在Oracle中,您可以使用START WITH id=yourid CONNECT BY PR

我有一个表
(id,parent\u id,data)
,其中
parent\u id
指向同一表中的另一行(或为空)

有没有标准的方法来查询(1)某个id的所有祖先和(2)某个id的所有后代

我也在
DBIx::Class
中这样做,因此,如果有一种最方便的方法可以使用该模块(或其他一些模块)来实现,我也很想听听这个


编辑:澄清-所有父项=所有祖先,所有子项=所有后代。

这在很大程度上取决于您使用的SQL的风格

在Oracle中,您可以使用
START WITH id=yourid CONNECT BY PRIOR id=parent\u id
构造。在PostgreSQL中,可以使用函数
connectby('tablename','id','parent\u id','id',value,0)

在许多情况下,表示树是有意义的 不同的是,通过定义一列, 对于每个节点,从根元素开始的完整路径 到该节点

这种技术有很多例子 在互联网上找到的,我最近看到的一个,
这也涉及到,可以在这里找到:

看起来我们现在要去。它几乎完成了我想要的一切(不幸的是,没有结果集,但我们可以通过从另一个方向解决我们需要问的问题来解决这个问题)

然而,@Grrrr的回答让我思考了一下,我们可能会添加一个单独的表+模块
(id,record\u type,record\u祖先)
,它将附加到具有
parent\u id
列的模型,并提供一个
祖先
结果集(基本上是通过使用我们选择的w/e分隔符搜索相关祖先行中id的位置)。要获得这样一个结果集,这是一项相当多的工作,因此我们可能只会在发现问题时才会去那里,如果我们真的无法问“这是父x的子项吗”并且真的需要“这是子x的父项吗”


编辑:或者我们可能会使用-虽然它看起来像是原始的查看表格是不可理解的。

只有父母/孩子,或者所有的祖先/后代?还有,你使用的是哪种SQL风格?看起来有点SQL不可知;我们的开发数据库是SQLite,但生产可能是MySQL。另请看我经常做的一件事h此树正在树结构中重新定位节点。这似乎有点痛苦,因为我们有一个列存储整个祖先列表。我想重载更新以正确执行这一操作不会太糟糕。EEEEE h…除了级联部分。将
祖先
方法添加到行类中非常容易,eit你可以直接将它添加到你的
结果
类中,或者创建一个新的组件来对AdjancyList进行子类化,并添加你需要的方法。或者你也可以访问#dbix类,与我们聊一聊,仅仅是将该功能添加到AdjancyList本身;这似乎是一件非常合理的事情。@hobbs:my collaborator on这个项目提供了一个补丁,将一个祖先结果集添加到AdjacencyList(不确定他发布的id是什么,而且他没有足够的SO代表来发表自己的评论)。