再帰クエリが使用されることはめったにありません。主に、複雑で曖昧な構文のためです。
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)
as ( select 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番目のクエリの以前の実行の結果です。 などなど。 実際、データベースはそのようには機能しませんが、結果は説明したアルゴリズムの結果と同じになります。
その後、このテーブルのデータは通常どおりメインクエリで使用できます。
私はこの特定の例の適用可能性について話しているのではなく、再帰クエリの機能を実証するためにそれを書いているだけです。 このリクエストは、注文により実際には非常に遅くなります。