CData Virtuality Server は、WITH 句による再帰的および非再帰的な共通テーブル式をサポートしています。WITH
句項目は、後続のWITH
句項目およびメインクエリでテーブルとして参照できます。WITH
Clauseは、問い合わせをスコープした一時テーブルを提供すると考えることができます。
Usage
WITH
name
[(
column
, ...)]
AS
[/*+ no_inline */] (query expression) ...
Syntax Rules
- 投影されるカラム名はすべて一意でなければなりません。一意でない場合は、カラム名のリストを提供する必要があります;
WITH
句項目の列が宣言されている場合、それらはクエリ式によって投影される列の数と一致しなければなりません;WITH
各HAVING Clause項目はユニークな名前でなければなりません;- オプションの
no_inline
ヒントは、参照されるインライン・ビューとしてクエリ式が置換されるべきでないことをオプティマイザに示します。no_inline
、ソース・クエリの必要に応じて共通テーブルを複数評価することが可能です。
The WITH
clause is also subject to optimization and its entries may not be processed if they are not needed in the subsequent query.
Examples
WITH
n (x)
AS
(
SELECT
col
FROM
schema
.tbl)
SELECT
x
FROM
n
WITH
n (x)
AS
/*+ no_inline */ (
SELECT
col
FROM
schema
.tbl)
SELECT
x
FROM
n
Recursive Common Table Expressions
再帰共通表式は、共通表式の特別な形式で、それ自身を参照して再帰的または反復的に完全な共通表結果を構築することができます。
Usage
WITH name [(column, ...)] AS (anchor query expression UNION [ALL] recursive query expression) ...
再帰クエリ式は共通テーブルを名前で参照することができます。処理は、アンカー Query 式が最初に実行されるように流れます。結果は共通テーブルに追加され、再帰クエリ式を実行するために参照されます。このプロセスは、中間結果がなくなるまで、新しい結果に対して繰り返されます。
A non-terminating recursive common table expression can lead to excessive processing.
再帰的な共通テーブル式の暴走を防ぐため、処理は10000反復に制限されています。プッシュ・ダウンされる再帰的な共通テーブル式にはこの LIMIT は適用されませんが、他のソース固有の制限が適用される場合があります。
セッション変数dv.maxRecusionをより大きな整数値に設定することで、LIMITを変更することができます。最大値を超えると例外が発生します。
Example
SELECT
dv_session_set(
'dv.maxRecursion'
, 25);;
WITH
n (x)
AS
(
SELECT
'a'
UNION
SELECT
chr(ascii(x)+1)
FROM
n
WHERE
x <
'z'
)
SELECT
*
FROM
n;;
これは、処理が完了する前に再帰の制限に達するため、処理に失敗します。正の整数以外の値を指定すると例外が発生することに注意してください。