使用SQL在关系数据库中遍历树状数据


16

有没有一种方法可以遍历SQL中的树数据?我connect by在Oracle中了解,但是在其他SQL实现中还有另一种方法吗?我问是因为使用connect by它比编写循环或递归函数来为每个结果运行查询要容易。

由于某些人似乎对短语“树数据”感到困惑,因此我将进一步解释:我的意思是关于具有parent_id或类似字段的表,其中包含相同表中另一行的主键。

问题来自一个经验,当时我正在以这种方式存储在Oracle数据库中的数据,并且知道connect by在其他DBMS中未实现。如果要使用标准SQL,则必须为每个要使用的父级创建一个新的表别名。这很容易失控。


您有Joe Celko的解决方案。很少有样本:SQL中的树,Oracle中的树和层次结构嵌套集模型。没有必要使用语法糖;-)。
玛丽安

Answers:


14

Celko的书是很好的资源-如果有时过于“学术”。

我还真的发现了 这种称为“关闭表”的方法,可以很好地工作。

如果您使用的数据库允许递归CTE(例如PostgreSQL 8.4或更高版本,或SQL Server 2005或更高版本),那么它们实际上是最好的选择。如果您使用的是Oracle,那么总会有一个古老的“ connect by”

根据我的经验,以“幼稚树”模式处理一组表,并且必须弄清楚如何从该存储中提取正确的树,这比获得创建清洁器的机会更为普遍。 “关闭表”结构。


9

递归CTE将是您最简单的解决方案。SQL Server 2005和最新版本的PostgreSQL支持CTE。如果您使用的是SQL Server 2008或更高版本,则可以使用HIERARCHYID数据类型。您可以在HierarchyID中找到一个很好的示例:使用SQL Server 2008为数据层次结构建模

其他资源:


5

在SQL Server(2005及更高版本)中,可以使用“公用表表达式”来读取层次结构,有关几个示例,请参见Microsoft SQL Server 2005-CTE的简单层次结构示例。

我被推荐给乔·塞尔科(Joel Celko)撰写的一本关于该主题的书,尽管它实际上不是我自己真正看过的书,但它是乔·塞尔科(Joel Celko)撰写的“ SQL for Smarties中的树和层次结构”。


1

标准的SQL方法是“递归查询”,由递归CTE提供,并指定为 WITH [ RECURSIVE ]在查询中。规范中未指定实现,仅指定了可用于递归查询结构的方法。在最简单的情况下,数据结构的实现仅在一行上需要一个ID和Parent ID。

还有许多RDBMS特定的解决方案:例如,PostgreSQL支持递归CTE,但它也提供 ltree了在实现中提供不同优点和缺点的集合。

您可以通过搜索标记在此站点上找到更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.