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

ind*_*1ng 16 tree hierarchy feature-comparison

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

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

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

TML*_*TML 14

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

我也确实发现 这种称为“闭包表”的方法非常有效。

如果您使用的数据库允许递归 CTE(例如PostgreSQL 8.4 或更高版本,或者SQL Server 2005 或更高版本),它们确实是最好的方法。如果您使用 Oracle,那么总会有令人尊敬的“连接方式”

根据我的经验,在“朴素树”模式中处理一组表,并且必须弄清楚如何从该存储中提取正确的树,比有机会创建清洁器要常见得多“闭合表”结构。


Jer*_*hka 9

递归 CTE 将是您最简单的解决方案。SQL Server 2005 和当前版本的 PostgreSQL 支持 CTE。如果您使用的是 SQL Server 2008 或更高版本,则可以使用HIERARCHYID数据类型。您可以在HierarchyID 中找到一个很好的例子:Model Your Data Hierarchies with SQL Server 2008

其他资源:


Dav*_*ett 5

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

我被推荐了一本关于该主题的更广泛的书,它是 Joe Celko 所著的“Smarties 中 SQL 中的树和层次结构”——尽管我自己还没有真正看过这本书。