いくつかの Oracle SQL クエリを変換して、(理論的には) 任意の SQL データベースで動作するようにしようとしています。一部のクエリは本質的に階層的であり、CONNECT BY を使用して記述されています。
Oracle の START WITH...CONNECT BY 構文に代わる標準的な SQL はありますか? または、階層クエリを変換するために従うべき推奨プロセスはありますか?
Oracle 11gR2 では、Common Table Expressions での再帰をサポートしています (ほとんどの Oracle 関係者は、サブクエリ ファクタリング、つまりWITH
句として知っているものです)。これは ANSI の方法であるため、より移植性が高いはずです。
Tom Kyte は、 2009 年 11 月号の Oracle マガジンで Recursive Subquery Factoring について書いています。
Recursive Subquery Factoring をサポートしていないデータベースに対して階層クエリが必要な場合 ( APC の回答を参照)、非常にローテクな代替手段の 1 つは、階層を別のキーにエンコードすることです。もちろん、これは、テーブルの更新プロセスを制御し、親の更新に続いてキーを書き換えることができる場合にのみ機能します。
例えば:
FLAT_HIER_ID NODE_ID PARENT_NODE_ID
~N1 N1
~N1~N2 N2 N1
~N1~N2~N3 N3 N2
~N1~N2~N4 N4 N2
あまりエレガントではありませんが、クエリのルートを提供します。
もう 1 つの (おそらくより良い) オプションは、" Nested Set Model " メソッドを使用することです。これは、MSSQL、MySQL、および MS Access でサブケースのクエリを処理するために Fogbugz で使用されるメソッドです。
モデルは次の場所で説明されています。
http://www.developersdex.com/gurus/articles/112.asp
Fogbugz でのメソッドの使用については、次の場所で説明されています。
http://www.fogcreek.com/FogBugz/blog/post/Subcases-and-Hierarchy.aspx