CONNECT BY的标准替代品?

时间:2009-11-03 17:21:56

标签: sql oracle ansi-sql

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

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

2 个答案:

答案 0 :(得分:6)

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

Tom Kyte在November 09 edition of Oracle magazine中写了关于递归子查询因子的文章。

答案 1 :(得分: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