再帰的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番目のクエリの以前の実行の結果です。 などなど。 実際、データベースはそのようには機能しませんが、結果は説明したアルゴリズムの結果と同じになります。

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

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

Source: https://habr.com/ru/post/J27439/


All Articles