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,那么总会有令人尊敬的“连接方式”。
根据我的经验,在“朴素树”模式中处理一组表,并且必须弄清楚如何从该存储中提取正确的树,比有机会创建清洁器要常见得多“闭合表”结构。
递归 CTE 将是您最简单的解决方案。SQL Server 2005 和当前版本的 PostgreSQL 支持 CTE。如果您使用的是 SQL Server 2008 或更高版本,则可以使用HIERARCHYID
数据类型。您可以在HierarchyID 中找到一个很好的例子:Model Your Data Hierarchies with SQL Server 2008
其他资源:
在 SQL Server(2005 及更高版本)中,您可以使用公共表表达式来读取层次结构,请参阅Microsoft SQL Server 2005 - CTE 简单层次结构示例以获取几个示例。
我被推荐了一本关于该主题的更广泛的书,它是 Joe Celko 所著的“Smarties 中 SQL 中的树和层次结构”——尽管我自己还没有真正看过这本书。
归档时间: |
|
查看次数: |
7764 次 |
最近记录: |