再帰的SQLクエリ

再帰的SQLクエリは、ツリーの問題や再帰的処理を必要とする他の問題を解決する1つの方法です。 これらはSQL 99標準に追加されたもので、それ以前はOracleにすでに存在していました。 標準はかなり前に出てきたという事実にもかかわらず、実装は遅れています。 たとえば、MS SQLでは2005番目のサーバーでのみ表示されました。



再帰クエリが使用されることはめったにありません。主に、複雑で曖昧な構文のためです。

with [ recursive ] <query_alias_name> [(<column list>)]

as (<クエリ>)

<主なリクエスト>


MS SQLには再帰的なキーワードはありませんが、それ以外はすべて同じです。 この構文は、DB2、Sybase iAnywhere、MS SQL、およびSQL 99標準をサポートするすべてのデータベースでサポートされています。



例によって解析しやすくなりました。 テーブルがあるとします:

テーブル tree_sampleを作成

nullで ない キーの id 整数

id_parent 整数の 外部 キー 参照 tree_sample(id)、

nm varchar (31))




id-識別子

id_parent-親参照

nmは名前です。



ツリーを表示するには:

再帰的ツリー(nm、id、 level 、pathstr)

asselect nm、id、0、 cast''テキストとして

tree_sample から

id_parent nullです

すべてを 結合 する

tree_sample.nm、tree_sample.id、tを選択します レベル + 1、tree.pathstr + tree_sample.nm

tree_sample から

tree.id = tree_sample.id_parentの内部 結合ツリー)

選択 id、 スペースレベル )+ nm として nm

から

pathstr による 順序付け




この例では、インデントされたテーブルにツリーを表示します。 tree_sampleからの最初のクエリ、このクエリはツリーのすべてのルートを返します。 2番目のクエリは、tree_sampleテーブルとtreeを接続します。これは、同じクエリによって決定されます。 このクエリは、ツリーノードでテーブルを完成させます。



最初の要求が最初に実行されます。 次に、2番目のクエリの結果がその結果に追加されます。データテーブルツリーは、最初のクエリの結果です。 次に、2番目のクエリが再度実行されますが、ツリーテーブルのデータはすでに2番目のクエリの以前の実行の結果です。 などなど。 実際、データベースはそのようには機能しませんが、結果は説明したアルゴリズムの結果と同じになります。



その後、このテーブルのデータは通常どおりメインクエリで使用できます。



私はこの特定の例の適用可能性について話しているのではなく、再帰クエリの機能を実証するためにそれを書いているだけです。 このリクエストは、注文により実際には非常に遅くなります。



All Articles