Hitachi

Hitachi Advanced Data Binder SQLリファレンス


3.9.1 CREATE VIEW文の指定形式および規則

ビュー表を定義します。

〈この項の構成〉

(1) 指定形式

CREATE VIEW文::=CREATE VIEW 表名 〔(列名リスト)〕 AS 問合せ式LIMIT句列名リスト::=列名〔,列名〕…

(2) 指定形式の説明

表名

定義するビュー表の表名を指定します。すでに定義されている実表およびビュー表と同じ表名は指定できません。表名の指定規則については,「6.1.5 名前の修飾」の「(2) 表名の指定形式」を参照してください。

列名リスト
列名リスト::=列名〔,列名〕…

ビュー表を構成する列を指定します。

列名

ビュー表を構成する列の列名を指定します。1つのビュー表に同じ列名を指定できません。

なお,HADBによって自動的に設定される導出列名と重複する可能性があるため,列名にEXPnnnn_NO_NAMEを指定しないでください。nnnnは,00009999の符号なし整数です。

留意事項を次に示します。

  • 列名リストに指定する列名の数と,問合せ式によって導出される表の列数を同じにしてください。

  • 列名リストによって導出される列数は1,000以下にしてください。

  • 列名リストを省略した場合,問合せ式によって導出される列名が,ビュー表を構成する各列の列名となります。導出される列名については,「6.9 導出列名」を参照してください。

  • 次に示す場合は,列名リストを指定する必要があります。

    ・導出列名が重複している場合

    ・導出列名が設定されていない列が1つでもある場合

AS 問合せ式 LIMIT句

ビュー表の定義内容を表す問合せ式を指定します。問合せ式については,「7.1 問合せ式」を参照してください。

問合せ式中に指定した表は,ビュー表の基になる表(基表)になります。

問合せ式には,次に示す項目を指定できません。

  • 表指定.〕ROW

  • ?パラメタ

メモ

問合せ式中の最も外側の問合せ指定の選択リストに,*または表指定.*を指定してCREATE VIEW文を実行し,そのあとで基表に列を追加しても,ビュー表にその列は追加されません。

LIMIT句

問合せ式の検索結果として取得する行数の最大値を指定します。

LIMIT句については,「7.9 LIMIT句」を参照してください。

(3) 実行時に必要な権限

CREATE VIEW文を実行する場合,次に示すすべての権限が必要になります。

(4) 規則

  1. システム内で合計30,000個まで,ビュー表を定義できます。

  2. CREATE VIEW文の最大長は64,000バイトです。

  3. CREATE VIEW文に指定できる表参照中の表名,導出表表関数導出表,および集まり導出表の延べ数は,最大2,047個になります。

    ただし,表参照中に次の指定がある場合,次の指定が内部導出表に等価変換されたあとのSQL文に対して延べ数のチェックが行われます。

    • 問合せ名

    • ビュー表

      CREATE VIEW文中にビュー表を指定している場合は,CREATE VIEW文中に指定したビュー表を導出表に等価変換したあとに,延べ数のチェックが行われます。

    SQL文中に指定されている表,導出表表関数導出表,および集まり導出表の数え方の規則と例については,「4.4.1 SELECT文の指定形式および規則」の「(4) 規則」を参照してください。

  4. CREATE VIEW文に指定できる問合せ指定および表値構成子の合計指定数は,最大1,023個になります。

  5. HADBサーバに接続した認可識別子のHADBユーザと異なるスキーマ名を持つビュー表は定義できません。

  6. ビュー表を構成する列の属性(データ型,データ長,非ナル値制約の有無)は,CREATE VIEW文の問合せ式の結果,導出される表の列の属性と同じになります。

  7. ビュー表には,読み取り専用ビュー表更新可能ビュー表があります。読み取り専用ビュー表に対しては,行の挿入,更新,および削除はできません。

  8. ビュー表が,読み取り専用ビュー表になるか,更新可能ビュー表になるかは,「AS 問合せ式」の指定内容で決まります。次の場合に読み取り専用ビュー表になります。

    • 最も外側の問合せ指定に,表の結合,結合表,導出表,表関数導出表,SELECT DISTINCTGROUP BY句,HAVING 句,ウィンドウ関数または集合関数を指定した場合

    • 最も外側の問合せ指定の選択式に,基表の同一列を複数指定した場合

    • 最も外側の問合せ指定の選択式に,列指定以外を指定した場合

    • 最も外側の問合せ指定のFROM句に指定した表と同じ表を,副問合せのFROM句に指定した場合

    • 最も外側の問合せ指定のFROM句に,読み取り専用ビュー表を指定した場合

    • 最も外側の問合せ指定を演算項に持つ集合演算を指定した場合

    • LIMIT句を指定した場合

    • 最も外側の問合せ指定のFROM句に再帰的問合せ名を指定した場合

    • 最も外側の問合せ指定のFROM句に,ディクショナリ表またはシステム表を指定した場合

    注※

    導出表が展開されたことによって,読み取り専用ビュー表となる条件を満たさなくなった場合,そのビュー表は更新可能ビュー表になります。導出表の展開規則については,「7.31.3 導出表の展開規則」を参照してください。

    ディクショナリ表を検索すると,定義したビュー表が読み取り専用ビュー表か,または更新可能ビュー表かが確認できます。確認方法については,マニュアルHADB システム構築・運用ガイドビュー表の更新可否を調べる方法を参照してください。

  9. 定義したビュー表に対するアクセス権限は,次に示す規則に従って決まります。

    • ビュー表に対するアクセス権限は,ビュー表を定義したHADBユーザが,すべての基表に対して持っているアクセス権限によって決まります。例えば,定義するビュー表に対してINSERT権限を持ちたい場合は,すべての基表に対するINSERT権限が必要になります。

    • CREATE VIEW文の問合せ式に,次の指定をして定義したビュー表に対するアクセス権限の決定規則を説明します。

      • 表値構成子

      • 表関数導出表

      • 集まり導出表

      表値構成子によって導出される導出表表関数導出表,および集まり導出表に対しては,ビュー表を定義するHADBユーザは付与権付きのアクセス権限を持っていると仮定されます。そのため,CREATE VIEW文の問合せ式にほかの基表を指定している場合,定義したビュー表に対するアクセス権限は次のようになります。

      (例)

      • CREATE VIEW文の問合せ式に,表値構成子と付与権付きのアクセス権限を持っている基表を指定した場合

        定義したビュー表には,表値構成子によって導出される導出表と基表に対して持っているアクセス権限の共通部分が適用されます。したがって,この場合,ビュー表を定義したHADBユーザは,そのビュー表に対する付与権付きのアクセス権限を持ちます。

      • CREATE VIEW文の問合せ式に,表値構成子とSELECT権限だけを持っている基表を指定した場合

        定義したビュー表には,表値構成子によって導出される導出表と基表に対して持っているアクセス権限の共通部分が適用されます。したがって,この場合,ビュー表を定義したHADBユーザは,そのビュー表に対するSELECT権限だけを持ちます。

  10. ビュー表に対するアクセス権限をほかのHADBユーザに付与する場合は,そのビュー表の全基表に対するアクセス権限を付与権付きで持っている必要があります。

  11. 基表に対するアクセス権限が新たに付与された場合,その基表に依存するビュー表に対するアクセス権限も新たに付与されます(アクセス権限の伝搬が発生します)。例えば,HADBユーザAが,表X.T1を基表としたビュー表A.V1と,ビュー表A.V1を基表としたビュー表A.V2を定義している場合に,表X.T1に対するINSERT権限がHADBユーザAに付与されると,ビュー表A.V1A.V2に対するINSERT権限も付与されます。

  12. 基表に対するアクセス権限が取り消された場合,その基表に依存するビュー表に対するアクセス権限も取り消されます。

  13. CREATE VIEW文の問合せ式に,スカラ関数CONTAINS(同義語検索指定あり)を指定してビュー表を定義した場合の規則を次に示します。

    • 同義語検索指定で指定した同義語辞書を削除した場合,ビュー表へのアクセス時にエラーとなります。

    • 同義語検索指定で指定した同義語辞書を更新した場合,更新内容は定義したビュー表に反映されます。

  14. CREATE VIEW文の問合せ式に指定したWITH句中の問合せ名を,CREATE VIEW文中で参照しないビュー表を定義し,そのビュー表を検索する際は,次の規則が適用されます。また,そのビュー表を別のCREATE VIEW文中に指定する際も,次の規則が適用されます。

    • CREATE VIEW文中で参照されていない問合せ名に対応する問合せ式本体の構成要素の数は,構成要素数の上限チェックの対象になりません。

    • CREATE VIEW文中で参照されていない問合せ名に対応する問合せ式本体に指定されている表については,排他が確保されません。

    例を次に示します。

    (例)ビュー表の定義時

    CREATE VIEW "V1"
        AS WITH "Q1" AS (SELECT "T1"."C1","T2"."C2" FROM "T1","T2")
           SELECT * FROM "T3"
    [説明]

    ビュー表の定義時には,上記で説明した規則は適用されません。そのため,CREATE VIEW文に指定されている問合せの数は2(問合せ名Q1に対応する問合せと主問合せ)となります。また,指定されている表の数は3(実表T1T2,およびT3)となります。

    (例)ビュー表の検索時

    SELECT * FROM "V1"
    [説明]
    • ビュー表の検索時には,上記で説明した規則が適用されます。そのため,SELECT文に指定されている問合せの数は2(主問合せと,ビュー表V1を等価変換した導出表の導出問合せ)となります。

    • 指定されている表の数は2(ビュー表V1を等価変換した導出表と,導出表の導出問合せ中の実表T3)となります。この規則に基づいて,1SQL文中に指定できる問合せの数や表の上限値のチェックが行われます。

    • 実表T1T2については,排他が確保されません。

  15. CREATE VIEW文の問合せ式中に副問合せを入れ子で指定する場合,入れ子の数は31回以内にしてください。また,FROM句に指定した表がビュー表の場合,その基となる問合せ式を指定した内部導出表を適用したあとの副問合せの入れ子の数が31回以内になるようにしてください。詳細については,「7.3.1 副問合せの指定形式および規則」の「(4) 規則」の「(a) 副問合せ共通の規則」を参照してください。

    (例1)

    CREATE VIEW "V1"
      AS SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM "T1") AS DT32
         ) AS DT31 ) AS DT30 ) AS DT29 ) AS DT28 ) AS DT27 ) AS DT26 ) AS DT25 ) AS DT24
         ) AS DT23 ) AS DT22 ) AS DT21 ) AS DT20 ) AS DT19 ) AS DT18 ) AS DT17 ) AS DT16
         ) AS DT15 ) AS DT14 ) AS DT13 ) AS DT12 ) AS DT11 ) AS DT10 ) AS DT9 ) AS DT8
         ) AS DT7 ) AS DT6 ) AS DT5 ) AS DT4 ) AS DT3 ) AS DT2 ) AS DT1 ) AS DT0

    上記の例の場合,ビュー表V1の副問合せの入れ子の数は32回となり,上限を超えているため,CREATE VIEW文がエラーになります。

    なお,T1は実表とします。

    (例2)

    CREATE VIEW "V2"           ← ビュー表V2
      AS SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (
         SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM "T1") AS DT30
         ) AS DT29 ) AS DT28 ) AS DT27 ) AS DT26 ) AS DT25 ) AS DT24 ) AS DT23 ) AS DT22
         ) AS DT21 ) AS DT20 ) AS DT19 ) AS DT18 ) AS DT17 ) AS DT16 ) AS DT15 ) AS DT14
         ) AS DT13 ) AS DT12 ) AS DT11 ) AS DT10 ) AS DT9 ) AS DT8 ) AS DT7 ) AS DT6
         ) AS DT5 ) AS DT4 ) AS DT3 ) AS DT2 ) AS DT1 ) AS DT0
    CREATE VIEW "V3" AS SELECT * FROM "V2"       ← ビュー表V3
    CREATE VIEW "V4" AS SELECT * FROM "V3"       ← ビュー表V4
    • ビュー表V2の副問合せの入れ子の数は30回となります。そのため,CREATE VIEW文を実行できます。

    • ビュー表V3の副問合せの入れ子の数は,内部導出表が適用された結果,31回となります。そのため,CREATE VIEW文を実行できます。

    • ビュー表V4の副問合せの入れ子の数は,内部導出表が適用された結果,32回となります。上限を超えているため,CREATE VIEW文がエラーになります。

    なお,T1は実表とします。

  16. CREATE VIEW文の問合せ式中に,ビューレベルが33のビュー表を指定できません。

  17. HADBサーバをバージョンアップする際,ディクショナリ表またはシステム表に依存するビュー表が自動的に再作成されることがあります。ビュー表が再作成される条件については,マニュアルHADB システム構築・運用ガイドバージョンアップ時の注意事項バージョンアップ時に行われるビュー表の再作成を参照してください。

  18. トランザクションの開始後に定義されたビュー表を,そのトランザクションからアクセスすることはできません。

(5) 例題

例題1

店舗表(SHOPSLIST)から,店舗住所(ADDRESS)列以外の列を検索できる店舗表のビュー表(VSHOPSLIST)を定義します。店舗表のビュー表を構成する列の順序と列名は次のとおりとします。

  • 店舗コード(SHOP_CODE

  • 地域コード(RGN_CODE

  • 店舗名(SHOP_NAME

  • 店舗電話番号(TEL_NO

CREATE VIEW "VSHOPSLIST" ("SHOP_CODE","RGN_CODE","SHOP_NAME","TEL_NO")
    AS SELECT "SHOP_CODE","RGN_CODE","SHOP_NAME","TEL_NO"
           FROM "SHOPSLIST"

店舗表のビュー表(VSHOPSLIST)は,更新可能ビュー表になります。

例題2

販売履歴表(SALESLIST)と商品表(PRODUCTSLIST)から,売り上げ金額の最大値(QMAXSALES)を商品名(PUR-NAME)ごとに求める売り上げ表(VSALES)を,ビュー表として定義します。売り上げ表(VSALES)の列構成は次のとおりとします。

  • 商品名(VPUR_NAME

  • 売り上げ金額の最大値(VQMAXSALES

■ビュー表の定義

CREATE VIEW "VSALES" ("VPUR-NAME","VQMAXSALES")
    AS WITH "QT1"("QCODE","QMAXSALES") AS (SELECT "PUR-CODE",MAX("PRICE" * "QUANTITY")
                                             FROM "SALESLIST"
                                               GROUP BY "PUR-CODE")
       SELECT "PUR-NAME","QMAXSALES"
         FROM "QT1" INNER JOIN "PRODUCTSLIST" ON "QCODE"="PUR-CODE"

[図データ]

■ビュー表の検索

SELECT * FROM "VSALES"

[図データ]