我正在尝试将一些 Oracle SQL 查询转换为(理论上)任何 SQL 数据库。一些查询本质上是分层的,并使用 CONNECT BY 编写。
是否有标准 SQL 替代 Oracle 的 START WITH...CONNECT BY 语法?或者是否有一些我应该遵循的推荐过程来转换分层查询?
在 Oracle 11gR2 中,它们支持公用表表达式中的递归(大多数 Oracle 人都知道子查询因式分解,即WITH
子句)。由于这是 ANSI 做事的方式,它应该更便携。
Tom Kyte 在11 月 9 日的 Oracle 杂志上写了关于递归子查询分解的文章。
如果您需要对不支持递归子查询分解的数据库进行分层查询(请参阅APC 的答案),一种技术含量非常低的替代方法是将层次结构编码为单独的键。当然,这只有在您可以控制表更新过程并在父更新之后重写密钥时才有效。
例如:
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