SQLは非線形の再帰処理をサポートしません。
再帰処理が線形の場合、再帰的ビューの呼び出しで多くても1つのその再帰的ビューの直接呼び出しが生成されます。線形性を強化するために、SQLはテーブルの参照を再帰的ビュー定義内の1つに制限します。これは再帰文のFROM句かまたは再帰文のsubquery のいずれかで指定できます。ただし両方に指定することはできません。
再帰処理が次のルールに従う場合、それは線形であると見なせます。
- 再帰的ビュー定義の結合されたすべてのテーブルで、再帰的に定義されたテーブルが1度だけ参照される。
- 再帰的に定義されたテーブルは、同じクエリーの指定のFROM句とsubquery のどちらか一方でのみ参照される。
- 再帰的に定義されたテーブルは、クエリーの指定のFROM句で2度以上参照されない。
これらの条件のいずれかが満たされない場合、再帰処理は線形になりません。
以下の作成テキストは、再帰的ビュー定義を作成する無効な試行の例です。ビュー定義に再帰的に定義された関係のFROM句の中で再帰ビューFibonacciが(それぞれpとppという列別名を使用して)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;