再帰的ビュー定義はすべて線形でなければならない - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
ft:locale
ja-JP
ft:lastEdition
2021-03-30
dita:mapPath
ja-JP/jpx1556733107962.ditamap
dita:ditavalPath
ja-JP/jpx1556733107962.ditaval
dita:id
B035-1184
Product Category
Software
Teradata Vantage

SQLは非線形の再帰処理をサポートしません。

再帰処理が線形の場合、再帰的ビューの呼び出しで多くても1つのその再帰的ビューの直接呼び出しが生成されます。線形性を強化するために、SQLはテーブルの参照を再帰的ビュー定義内の1つに制限します。これは再帰文のFROM句かまたは再帰文のsubquery のいずれかで指定できます。ただし両方に指定することはできません。

再帰処理が次のルールに従う場合、それは線形であると見なせます。

  • 再帰的ビュー定義の結合されたすべてのテーブルで、再帰的に定義されたテーブルが1度だけ参照される。
  • 再帰的に定義されたテーブルは、同じクエリーの指定のFROM句とsubquery のどちらか一方でのみ参照される。
  • 再帰的に定義されたテーブルは、クエリーの指定のFROM句で2度以上参照されない。

これらの条件のいずれかが満たされない場合、再帰処理は線形になりません。

以下の作成テキストは、再帰的ビュー定義を作成する無効な試行の例です。ビュー定義に再帰的に定義された関係のFROM句の中で再帰ビューFibonacciが(それぞれpppという列別名を使用して)2度以上参照されているため、この定義は無効です。これは、3つ目の箇条書き項目のルールに違反しています。

     CREATE RECURSIVE VIEW fibonacci (n, f, mycount) AS
       SELECT a, b, 0 AS mycount
       FROM t
       WHERE (a=0
       AND    b=0)
       OR    (a=1
       AND    b=1)
     UNION ALL
       SELECT n+1, p.f + pp.f, p.mycount + 1
       FROM fibonacci AS p, fibonacci AS pp
       WHERE (p.n - 1) = pp.n
       AND   p.mycount <= 100;

同じような発想に基づく、派生テーブルを使用する次のクエリーにも同じ問題があります。

     CREATE RECURSIVE VIEW fibonacci (n, f, mycount) AS
       SELECT  n, f, mycount
       FROM (SELECT 0,0,0) AS a (n,f,mycount)
     UNION ALL
       SELECT n, f, mycount
       FROM (SELECT 1,1,0) AS b (n, f, mycount)
     UNION ALL
       SELECT n+1, p.f + pp.f, p.mycount + 1
       FROM fibonacci AS p, fibonacci AS pp
       WHERE (p.n - 1) = pp.n
       AND   p.mycount <= 100;