Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


1.1.8 名前の修飾

名前の修飾は,ピリオド(.)によって,認可識別子,表識別子などを連結して,認可識別子を明示したり,名前を一意にしたりするときに使用します。

〈この項の構成〉

(1) 表名,インデクス名,インデクス型名,ユーザ定義型名,ルーチン名,トリガ名,及び順序数生成子名

それぞれの名前の内容と形式を次に示します。

表名:

表識別子を認可識別子で修飾したもの

インデクス名:

インデクス識別子を認可識別子で修飾したもの

インデクス型名:

インデクス型識別子を認可識別子で修飾したもの

ユーザ定義型名:

データ型識別子を認可識別子で修飾したもの

ルーチン名:

ルーチン識別子を認可識別子で修飾したもの

トリガ名:

トリガ識別子を認可識別子で修飾したもの

順序数生成子名:

順序数生成子識別子を認可識別子で修飾したもの

表名::=〔認可識別子.〕表識別子

インデクス名::=〔認可識別子.〕インデクス識別子

インデクス型名::=〔認可識別子.〕インデクス型識別子

ユーザ定義型名::=〔認可識別子.〕データ型識別子

ルーチン名::=〔認可識別子.〕ルーチン識別子

トリガ名::=〔認可識別子.〕トリガ識別子

順序数生成子名::=〔認可識別子.〕順序数生成子識別子

指定項目

指定内容

規 則

認可識別子

指定する表識別子,インデクス識別子,インデクス型識別子,データ型識別子,ルーチン識別子,及びトリガ識別子が自分のものであれば,自分の認可識別子を指定します。他ユーザが所有するものであれば,そのユーザの認可識別子を指定します。ただし,表識別子にパブリックビュー,ルーチン識別子にパブリック手続き,パブリック関数の名前を指定する場合は,PUBLICを指定します。

なお,PUBLICの指定は,引用符で囲んだ指定,及び引用符で囲まない指定のどちらでも指定できます。

認可識別子を省略※3すると,次のとおりに仮定されます。

  • ユティリティの実行時

    ユティリティを起動するユーザの認可識別子

  • UAPの実行時※1

    UAPで認可識別子を省略すると,次の順で仮定されます。

  1. プリプロセスで指定した認可識別子

  2. CONNECT文のオペランドで指定した認可識別子

  3. CONNECT文のオペランドで指定がなかった場合は,クライアント環境定義PDUSERで指定した認可識別子

  4. PUBLIC(表識別子,ルーチン識別子※2を指定した場合)

表識別子

実表又はビュー表の名前を指定します。

インデクス識別子

インデクスの名前を指定します。

インデクス型識別子

インデクス型の名前を指定します。

データ型識別子

ユーザ定義型の名前を指定します。

ルーチン識別子

手続き又は関数の名前を指定します。

トリガ識別子

トリガの名前を指定します。

順序数生成子識別子

順序数生成子の名前を指定します。

注※1

定義系SQL,PREPARE文,又はEXECUTE IMMEDIATE文で指定したSQLの文字列中で認可識別子を省略した場合,次に示す順位で認可識別子が仮定されます。

  1. CONNECT時の認可識別子

  2. クライアントの環境変数に設定された認可識別子

  3. UAP実行ユーザ

  4. PUBLIC(定義系SQL以外で表識別子,ルーチン識別子を指定した場合)

注※2

ルーチン識別子の場合の認可識別子MASTERに関しては,「スキーマパス」を参照してください。

注※3

定義系SQLで他ユーザが所有するものを操作する場合,SQLの文字列中で認可識別子を省略したときは,所有者の認可識別子が仮定されます。

例えば,次の例では,1のSQL文は2のSQL文のように認可識別子が仮定されます。

(例)

ユーザ(認可識別子:USER007)のインデクス(I001)を表(T002)に作成します。

  1. CREATE INDEX USER007.I001 ON T002(C001)

  2. CREATE INDEX USER007.I001 ON USER007.T002(C001)

(2) 表指定

表指定は,一つのSQL文中に二つ以上の表を指定する場合に,指定する列,*,又はROWがどの表に対応するかを一意にするための修飾子で,表名,又は相関名を指定します。

相関名とは,同じ表同士の結合をしたい場合,及び同じ表を副問合せ中で指定し,その問合せ中で外側の問合せの表の列も参照する場合に,指定するそれらの表の別名として使用します。相関名を指定すると,一つの表を二つの異なる表として使用できます。

表指定::={〔認可識別子.〕表識別子|相関名|問合せ名}

WITH句を用いた問合せ式の問合せ式本体中の一つのFROM句に,WITH句に指定した問合せ名と,その問合せ名と同じ表識別子を指定する場合は,表識別子を認可識別子で明示的に修飾し,更にその問合せ名,及び表識別子に相関名を指定して名前を区別する必要があります。

WITH句を用いた問合せ式の問合せ本体中の表指定では,名前を認可識別子で修飾した場合,その名前を表識別子として扱い,名前を認可識別子で修飾しない場合,その名前を問合せ名,又は表識別子として扱います。ただし,名前を認可識別子で修飾しない場合の名前の優先順位は,問合せ名,表識別子の順になります。

表指定での修飾例を次に示します。

(例1)

複数の表(ZAIKO,JUTYU)にある同じ名前の列(SCODE)を参照するために,表名(ZAIKO)で修飾する場合

  SELECT ZAIKO.SCODE,SNAME,TCODE
      FROM ZAIKO,JUTYU
      WHERE ZAIKO.SCODE = JUTYU.SCODE
(例2)

同じ表(ZAIKO)同士の結合で,相関名(X,Y)を使用して修飾する場合

(商品コード101Mと同じ色の商品を検索します)

  SELECT X.* FROM ZAIKO X,ZAIKO Y
      WHERE X.COL = Y.COL AND Y.SCODE = '101M'
(例3)

相関名を使用して,長い名称の表名に対する記述を簡略化する場合

(ディクショナリ表から,自分の所有する表(ZAIKO)が格納されているRDエリアの名称を検索します)

  SELECT X.RDAREA_NAME
      FROM MASTER.SQL_RDAREAS X,
      MASTER.SQL_TABLES Y
      WHERE Y.TABLE_SCHEMA = 'U'
      AND Y.TABLE_NAME = 'ZAIKO'
      AND X.RDAREA_NAME = Y.RDAREA_NAME
(例4)

WITH句を用いた問合せ式で,問合せ式本体中の一つのFROM句にWITH句中の問合せ名(ZAIKO)と,その問合せ名と同じ名称の表識別子(ZAIKO)を指定する場合

  WITH ZAIKO(QC1,QC2) AS (SELECT SCODE,TANKA*ZSURYO FROM ZAIKO)
      SELECT * FROM ZAIKO X,USER1.ZAIKO Y

(3) 列指定

次の場合,列名又は繰返し列名を表指定で修飾する必要があります。この修飾された列名又は繰返し列名を列指定といいます。

  • 一つのFROM句に複数の表を指定した検索(二つ以上の表の結合)のときに,検索対象の複数の表に同じ列名がある場合(修飾しないと,指定した列がどの表の列なのか分かりません)

  • WITH句を用いた問合せ式の問合せ式本体中の一つのFROM句に,複数の問合せ名や表名を指定(二つ以上の表の結合)したときに,検索対象の複数の表,又はWITH句中の導出問合せ式によって導出された表に同じ列名がある場合(修飾しないと,指定した列がどの表の列なのか分かりません)

    (誤った例)

    選択式に指定したCLM1は,問合せ名QRY1の列名なのか,問合せ名QRY2の列名なのかが分からないため,列名を修飾してください。

          WITH QRY1(CLM1) AS (SELECT SNAME FROM ZAIKO),
               QRY2(CLM1) AS (SELECT SCODE FROM ZAIKO)
               SELECT CLM1 FROM QRY1,QRY2
    (正しい例)

    指定した列は,修飾した列名にする必要があります。

          WITH QRY1(CLM1) AS (SELECT SNAME FROM ZAIKO),
               QRY2(CLM1) AS (SELECT SCODE FROM ZAIKO)
               SELECT QRY1.CLM1,QRY2.CLM1 FROM QRY1,QRY2
  • 副問合せを指定した場合,副問合せ中のWHERE句,又はHAVING句中で,その副問合せの外側のFROM句で指定した表,又は更新する表の列を参照するとき(修飾しないと,外側の表の列を参照できません)

ただし,列名は構文上,修飾できる場合とできない場合があります。各形式中の「列指定」と記述している箇所は,列名に修飾できます。「列名」と記述している箇所は,修飾できません。

列指定::=〔表指定.〕{列名|繰返し列名〔[添字]〕}

添字::={整数|ANY}

列名を表指定で修飾する場合,次に示す規則があります。

  • 列名は,指定する相関名,又は表名の有効範囲内でだけ,その相関名,又は表名を修飾できます。相関名及び表名の有効範囲については,「表参照」,「DELETE文 形式1(行削除)」,及び「UPDATE文 形式1(データ更新)」を参照してください。

  • 副問合せ中に,同じ名前の有効な表指定(相関名,又は表名)を複数指定した場合,その表指定(相関名,又は表名)を参照すると,最も内側にある問合せで指定している表指定(相関名,又は表名)が指定されます。

    同じ名前の有効な表名が複数ある例を次に示します。

    (例)

    副問合せ中では,T11とT12の両方の指定が有効です。T1を参照すると,最も内側にある問合せのT12が適用されます。

          SELECT * FROM T11
              WHERE T11.C2 >=
                ( SELECT AVG(C2) FROM T12
                  WHERE T12.C1 = 1       )

       T11の有効範囲:SELECT * FROM T11以降

       T12の有効範囲:(SELECT AVG(C2) FROM T12以降

    なお,最も局所的な有効範囲を持つ表が複数ある(一つのFROM句に同一の表名が複数ある)場合,相関名で修飾する必要があります。

    FROM句に同一の表名が複数ある例を次に示します。

    (誤った例)

    副問合せの範囲は最も局所的な有効範囲を持つ表T11とT12がある場合,この指定では誤りになるため,相関名を指定してください。

          SELECT * FROM T2
              WHERE C3 IN
                ( SELECT T11.C3 FROM T11,T12
                  WHERE T11.C1 = T12.C3     )

       最も局所的な有効範囲:(SELECT T11.C3 FROM T11,T12以降

    (正しい例)

    指定した列は,修飾子で指定した表になければなりません。

          SELECT * FROM T2
              WHERE C3 IN
                ( SELECT X.C3 FROM T11 X,T12 Y
                  WHERE X.C1 = Y.C2           )
  • 列名を表指定で修飾できますが,修飾しない場合,最も局所的な有効範囲を持つ中に,指定した列を含む表を示すものが一つだけ必要です。



目次