複合主キーである ID とバージョンを持つドキュメントを表すテーブルがあるとします。ドキュメントの複数のバージョンが同時にテーブルに存在する可能性があります。
create table document (id bigint not null, version int not null,
data varchar(255), primary key(id, version));
ビューの階層を含む別のテーブルがあります。(この例では外部キーやその他の制約を省略していますが、それらは適用されます)。
create table view (id bigint primary key, parent_id bigint);
そして、ビューを一連のドキュメントに関連付ける行を含む別のテーブル。view_doc.view_id と view_doc.doc_id に一意の制約があると仮定して、特定のドキュメントが特定のビューに複数回表示されないようにします。
create table view_doc (id bigint primary key, view_id bigint not null,
doc_id bigint not null, doc_version int);
論理的には、ビューにはそれが定義するすべてのドキュメント/バージョンが含まれます。子ビュー (view.parent_id が null でない) には、親のすべてのドキュメント/バージョンと、それ自体のドキュメントが含まれます。子ビューとその親で異なるバージョンのドキュメントが定義されている場合、子ビューで指定されたそのドキュメントのバージョンのみが表示されます。ドキュメントが NULL doc_version を使用して子ビューで指定されている場合、ドキュメントはその親ビューに存在する場合でも、その子ビューには存在しないと見なされます。
上記のルールで定義されているように (子ビューであるかどうかに関係なく)、view.id を指定すると、ビュー内のすべてのドキュメントとそれぞれのバージョンのリストが得られる SQL を構築したいと考えています。これが最終的に再帰クエリになる可能性があることはわかっていますが、単純化する場合は、厳密な 2 レベルの階層も受け入れます (つまり、子ビューの parent_id は常に null と見なすことができます)。
これを Oracle、DB2、および SQL Server で表現する必要があります。3 つのデータベースすべてでまったく同じクエリである必要はありませんが、それは確かに良いことです。
このクエリをすばやく実行するには、どのように記述しますか?