【问题标题】:Standard alternative to CONNECT BY?CONNECT BY 的标准替代方案?
【发布时间】:2010-12-12 17:39:54
【问题描述】:

我正在尝试将一些 Oracle SQL 查询转换为(理论上)任何 SQL 数据库。一些查询本质上是分层的,并且是使用 CONNECT BY 编写的。

是否有标准 SQL 替代 Oracle 的 START WITH...CONNECT BY 语法?或者我应该遵循一些推荐的流程来转换分层查询?

【问题讨论】:

  • 我不知道任何 ANSI 分层查询语法 - 至少在 SQL Server、MySQL 和 Postgres 之间是不同的。

标签: sql oracle ansi-sql


【解决方案1】:

在 Oracle 11gR2 中,它们支持公用表表达式中的递归(大多数 Oracle 人都知道子查询因式分解,即 WITH 子句)。由于这是 ANSI 做事的方式,它应该更便携。

Tom Kyte 在November 09 edition of Oracle magazine 中撰写了有关递归子查询分解的文章。

【讨论】:

  • AFAIK:SQL Server、Oracle 和 DB2 是唯一支持 WITH 子句的数据库。不知道DB2的版本是否支持递归……
【解决方案2】:

如果您需要针对不支持递归子查询分解的数据库进行分层查询(请参阅APC's answer),一种技术含量非常低的替代方法是将层次结构编码为单独的键。当然,这只有在您可以控制表更新过程并在父更新之后重写密钥时才有效。

例如:

FLAT_HIER_ID  NODE_ID   PARENT_NODE_ID
~N1           N1
~N1~N2        N2        N1
~N1~N2~N3     N3        N2
~N1~N2~N4     N4        N2

不是很优雅,但它为您提供了查询路径。

另一个(可能更好)选项是使用“嵌套集模型”方法。这是 Fogbugz 中用于处理 MSSQL、MySQL 和 MS Access 中的子案例查询的方法。

模型解释在:

http://www.developersdex.com/gurus/articles/112.asp

Fogbugz中方法的使用描述在:

http://www.fogcreek.com/FogBugz/blog/post/Subcases-and-Hierarchy.aspx

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2010-12-21
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多