再帰ビューの基本的な定義は、これらのコンポーネント クラスからなります。
- 非再帰的、またはシード クエリー クラス。
- 再帰的クエリー クラス。
- クエリー コンポーネントを接続するためのUNION ALLセット演算子。
- 無限の再帰処理を避けるための終了条件。
再帰的ビュー定義には複数のシード文と再帰文を含められます。
終了条件は通常、再帰文のWHERE句に明示的に指定するべきですが、これは必須ではありません。なぜなら、再帰的クエリーはユーザー スプールの領域およびシステム ディスクの領域の限界によって暗黙的に限定されるからです。
CREATE RECURSIVE VIEW文の次の基本BNF (BNF (Backus-Naur Form(バッカス ナウア記法)はコンピュータ言語の定義に使用されるメタ言語)を考えます。
CREATE RECURSIVE VIEW <view_name> [(<column_name_list>)] AS ( <query_expression_1> UNION ALL <query_expression_2>
説明
構文の要素 | 指定内容 |
---|---|
<view_name> | ビューの参照に使用される名前。 |
<column_name_list> | <view_name>によって参照されるビューの構築で使用される実テーブルの列名と式のセット。 |
<query_expression_1> | シード文。 |
<query_expression_2> | 再帰文。 |
かぎ括弧(<>)は識別子または複雑な構文を指し、大括弧([])はオプションの構文コンポーネントを指します。
以下の例は、再帰処理の概念で定義したフライトのテーブルに基づきます。
CREATE RECURSIVE VIEW reachable_from (source,destination,depth) AS ( SELECT root.source, root.destination, 0 AS depth FROM flights AS root WHERE root.source = 'Paris' UNION ALL SELECT in1.source, out1.destination, in1.depth + 1 FROM reachable_from AS in1, flights AS out1 WHERE in1.destination = out1.source AND in1.depth <= 100);
この例はCREATE RECURSIVE VIEWのBNFとどのように関連しているでしょうか。BNFの単位は次のようにこの例の再帰ビュー定義と対応しています。
BNF要素 | この例のクエリー要素で該当するもの |
---|---|
view_name | reachable_from |
column_name_list | source、destination、depth |
query_expression_1 | SELECT root.source, root.destination, 0 AS depth FROM flights AS root WHERE root.source = 'Paris' これは、再帰ビュー定義のシード文です(ビュー定義のシード文コンポーネントを参照)。この文は、その定義のどの時点でも再帰的な関係を参照しません。 |
query_expression_2 | SELECT in1.source,out1.destination,in1.depth + 1 FROM reachable_from AS in1, flights AS out1 WHERE in1.destination = out1.source AND in1.depth <=100 これは、再帰ビュー定義の再帰文です(ビュー定義の再帰文コンポーネントを参照)。再帰処理が発生するのは、ビュー名reachable_fromがこの文のFROM句で参照されているからです。 |