再帰的ビューの構築 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/jpx1556733107962.ditamap
dita:ditavalPath
ja-JP/jpx1556733107962.ditaval
dita:id
B035-1184
Product Category
Software
Teradata Vantage
再帰ビューの基本的な定義は、これらのコンポーネント クラスからなります。
  • 非再帰的、またはシード クエリー クラス。
  • 再帰的クエリー クラス。
  • クエリー コンポーネントを接続するための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句で参照されているからです。