我正在尝试将一些Oracle SQL查询转换为(理论上)任何SQL数据库。有些查询本质上是分层的,使用CONNECT BY编写。
是否有Oracle的START WITH ... CONNECT BY语法的标准SQL替代方法?或者我是否应该遵循一些推荐的流程来转换分层查询?
答案 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