6

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

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

4

2 回答 2

7

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

Tom Kyte 在11 月 9 日的 Oracle 杂志上写了关于递归子查询分解的文章。

于 2009-11-03T17:56:44.703 回答
2

如果您需要对不支持递归子查询分解的数据库进行分层查询(请参阅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

于 2009-11-04T11:24:27.000 回答