common-table-expression

共通表式table-identifier で結果表を定義し、それを後続の fullselect の任意の FROM 節で参照できます。

単一の WITH キーワードの後に、複数の共通表式を指定することができます。 指定したそれぞれの共通表式は、後続の共通表式の FROM 節内でも名前によって参照できます。

common-table-expression

構文図を読むビジュアルシンタックスダイアグラムをスキップする表識別子(,カラム名)AS( 全選択)

列のリストを指定する場合、その中の列の名前の数は、 全選択の結果表内の列数と同じ数でなければなりません。 各 column-name は、固有で、非修飾でなければなりません。 これらの列名を指定しない場合、名前は共通表式の定義に使用される fullselect の選択リストから得られます。

table-identifier は非修飾の SQL ID であることが必要で、同じステートメントにあるほかの table-identifier とは異なっている必要があります。 共通表式を INSERT ステートメント内で指定する場合、table-identifier は挿入の対象である表名やビュー名と同じであってはなりません。 共通表式を CREATE VIEW ステートメント内で指定する場合、table-identifier は作成されるビュー名と同じであってはなりません。 共通表式の table-identifier は、fullselect の全体にわたってどの FROM 文節の中でも表名として指定できます。

複数の共通表式が同じステートメント内で定義されている場合、共通表式の間での循環参照は許されません。 循環参照 が生じるのは、 2 つの共通表式 dt1dt2 が作成された場合に、 dt1dt2 を参照し、 dt2dt1 を参照するようになる場合です。 また、先に定義された共通表式は、その後で定義された共通表式を参照できません。

共通表式名は、その名前を定義する SELECT ステートメント、SELECT INTO ステートメント、INSERT ステートメント、CREATE VIEW ステートメント、または RETURN ステートメントの中でのみ参照できます。

トリガー定義に含まれていない SELECT ステートメント、SELECT INTO ステートメント、INSERT ステートメント、または CREATE VIEW ステートメントが非修飾の表名を参照する場合は、次の規則によって実際に参照される表が決まります。

  • 非修飾名が、SELECT ステートメント 内で指定されている 1 つ以上の共通表式名に対応している場合、名前は最も内側の有効範囲にある共通表式を示します。
  • そうでなければ、名前はデフォルト・スキーマ内にある永続表、一時表、またはビューを示します。

トリガー定義に含まれている SELECT ステートメント、SELECT INTO ステートメント、INSERT ステートメント、または CREATE VIEW ステートメントが非修飾の表名を参照する場合は、次の規則によって実際に参照される表が決まります。

  • 非修飾名が、SELECT ステートメント 内で指定されている 1 つ以上の共通表式名に対応している場合、名前は最も内側の有効範囲にある共通表式を示します。
  • 非修飾名が遷移表名に対応している場合、名前はその遷移表を示します。
  • そうでなければ、名前はデフォルト・スキーマ内にある永続表、一時表、またはビューを示します。

共通表式は、CREATE VIEW ステートメントと INSERT ステートメントの中で、全選択の前にオプションで指定することもできます。 ただし、SELECT 内 INSERT ステートメントの中で共通表式を使用することはできません。

共通表式は、次の場合に使用できます。

  • ビューの代わりに使用して、 ビューが作成されないようにするため (ビューを一般的に使用する必要がなく、 定位置の更新や削除を使わない場合)
  • 必要な結果表がホスト変数に基づいている場合
  • 同じ結果表を fullselect の中で共用する必要がある場合
  • 再帰を使用して結果を得る必要がある場合

共通表式の fullselect の FROM 文節に自身への参照が含まれている場合、 共通表式は再帰的共通表式 になります。 再帰処理を使用した照会は、部品表 (BOM)、予約システム、 およびネットワーク・プランなどのアプリケーションをサポートする上で役立ちます。

再帰的共通表式では、以下のことが成り立っていなければなりません。
  • 再帰サイクルを構成するそれぞれの fullselect が、SELECT または SELECT ALL で始まっていること。 SELECT DISTINCT は使用できません。 さらに、セット演算子には ALL キーワードを使用する必要があります。
  • 共通表式の table-name の後に列名を指定する必要があります。
  • 最初のセット演算子の最初にある fullselect (初期化fullselect) は、FROM 文節に共通表式自体への参照を含んでいてはなりません。
  • 共通表式の列名が反復 fullselect の中で参照される場合、その列のデータ・タイプ、長さ、および CCSID は、初期化 fullselect に基づいて決定されます。 反復 fullselect 内の対応する列のデータ・タイプおよび長さは、 初期化 fullselect に基づいて決定されるデータ・タイプおよび長さと同じであることが必要で、CCSID が一致している必要があります。 ただし、文字ストリング・タイプの場合は、 2 つのデータ・タイプの長さが違っても構いません。 この場合、反復 fullselect 内の列は、初期化 fullselect によって決定される長さに常時割り当て可能な長さであることが必要です。 再帰的共通表式の列が定義の中で再帰的に使用されない場合、 その列のデータ・タイプ、長さ、および CCSID は、非再帰的照会に関連した規則に従って決定されます。
  • 変更の開始再帰サイクルの一部である各フルセレクトには、集約関数、GROUP BY句、HAVING句、ORDER BY句、OFFSET句、FETCH FIRST句を含めてはなりません。 これらのフルセレクトのFROM句には、再帰サイクルの一部である共通テーブル式への参照を最大1つ含めることができます。変更の終わり
  • 副照会 (スカラーまたは比較) は、再帰サイクルに含まれていてはなりません。
  • 外部結合は、再帰サイクルに含まれていてはなりません。

再帰的共通表式で参照されるすべての列は、NOT NULL として定義されている場合でも照会で NULL 可能です。

再帰的共通表式を開発するときには、 無限再帰サイクル (ループ) が作成される恐れについて常に注意してください。 再帰サイクルが終了することを確認してください。 これは、関係しているデータが循環している場合に特に重要です。 再帰的共通表式には、無限ループを防止する述部を組み入れるようにしてください。 再帰的共通表式には、以下のものを組み入れるようにしてください。

  • 反復 fullselect 内で、定数によって増分する整数列。
  • カウンター列 < 定数」または「カウンター列 <:ホスト変数」という形式の、反復 全選択 の WHERE 節内の述部。 この構文が見付からない場合には警告が出されます。

再帰的共通表式の結果を使用して最終結果表を派生し、列マスクを使用して最終結果表の列値をマスクする場合は、再帰的共通表式の fullselect で指定されている列には列マスクを適用できません。