1.1.8 名前の修飾
名前の修飾は,ピリオド(.)によって,認可識別子,表識別子などを連結して,認可識別子を明示したり,名前を一意にしたりするときに使用します。
(1) 表名,インデクス名,インデクス型名,ユーザ定義型名,ルーチン名,トリガ名,及び順序数生成子名
それぞれの名前の内容と形式を次に示します。
- 表名:
-
表識別子を認可識別子で修飾したもの
- インデクス名:
-
インデクス識別子を認可識別子で修飾したもの
- インデクス型名:
-
インデクス型識別子を認可識別子で修飾したもの
- ユーザ定義型名:
-
データ型識別子を認可識別子で修飾したもの
- ルーチン名:
-
ルーチン識別子を認可識別子で修飾したもの
- トリガ名:
-
トリガ識別子を認可識別子で修飾したもの
- 順序数生成子名:
-
順序数生成子識別子を認可識別子で修飾したもの
表名::=〔認可識別子.〕表識別子
指定項目 |
指定内容 |
規 則 |
---|---|---|
認可識別子 |
指定する表識別子,インデクス識別子,インデクス型識別子,データ型識別子,ルーチン識別子,及びトリガ識別子が自分のものであれば,自分の認可識別子を指定します。他ユーザが所有するものであれば,そのユーザの認可識別子を指定します。ただし,表識別子にパブリックビュー,ルーチン識別子にパブリック手続き,パブリック関数の名前を指定する場合は,PUBLICを指定します。 なお,PUBLICの指定は,引用符で囲んだ指定,及び引用符で囲まない指定のどちらでも指定できます。 |
認可識別子を省略※3すると,次のとおりに仮定されます。
|
表識別子 |
実表又はビュー表の名前を指定します。 |
|
インデクス識別子 |
インデクスの名前を指定します。 |
|
インデクス型識別子 |
インデクス型の名前を指定します。 |
|
データ型識別子 |
ユーザ定義型の名前を指定します。 |
|
ルーチン識別子 |
手続き又は関数の名前を指定します。 |
|
トリガ識別子 |
トリガの名前を指定します。 |
|
順序数生成子識別子 |
順序数生成子の名前を指定します。 |
- 注※1
-
定義系SQL,PREPARE文,又はEXECUTE IMMEDIATE文で指定したSQLの文字列中で認可識別子を省略した場合,次に示す順位で認可識別子が仮定されます。
-
CONNECT時の認可識別子
-
クライアントの環境変数に設定された認可識別子
-
UAP実行ユーザ
-
PUBLIC(定義系SQL以外で表識別子,ルーチン識別子を指定した場合)
-
- 注※2
-
ルーチン識別子の場合の認可識別子MASTERに関しては,「スキーマパス」を参照してください。
- 注※3
-
定義系SQLで他ユーザが所有するものを操作する場合,SQLの文字列中で認可識別子を省略したときは,所有者の認可識別子が仮定されます。
例えば,次の例では,1のSQL文は2のSQL文のように認可識別子が仮定されます。
- (例)
-
ユーザ(認可識別子:USER007)のインデクス(I001)を表(T002)に作成します。
-
CREATE INDEX USER007.I001 ON T002(C001)
-
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句で指定した表,又は更新する表の列を参照するとき(修飾しないと,外側の表の列を参照できません)
ただし,列名は構文上,修飾できる場合とできない場合があります。各形式中の「列指定」と記述している箇所は,列名に修飾できます。「列名」と記述している箇所は,修飾できません。
列指定::=〔表指定.〕{列名|繰返し列名〔[添字]〕}
列名を表指定で修飾する場合,次に示す規則があります。
-
列名は,指定する相関名,又は表名の有効範囲内でだけ,その相関名,又は表名を修飾できます。相関名及び表名の有効範囲については,「表参照」,「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 )
-
列名を表指定で修飾できますが,修飾しない場合,最も局所的な有効範囲を持つ中に,指定した列を含む表を示すものが一つだけ必要です。