2.6.1 表参照の形式と規則
(1) 機能
検索する表,又は表の結合を指定します。表参照は表式中に指定します。
(2) 形式
表参照::={表一次子|結合表} 表一次子::={〔認可識別子.〕表識別子 〔IN (RDエリア名指定)〕 〔〔AS〕相関名〕 〔使用インデクスのSQL最適化指定〕 |問合せ名 〔〔AS〕相関名 〕〔使用インデクスのSQL最適化指定〕 |(結合表) |導出表〔〔AS〕相関名〔(導出列リスト)〕〕} 導出表::=表副問合せ 導出列リスト::=列名リスト 列名リスト::=列名〔,列名〕… 結合表::={表参照〔{INNER|{LEFT|RIGHT} 〔OUTER〕}〕 JOIN 〔結合方式のSQL最適化指定〕 表参照 ON 探索条件 |表参照 CROSS JOIN 表一次子}
(3) オペランド
-
〔IN (RDエリア名指定)〕
〔〔AS〕相関名〕 〔使用インデクスのSQL最適化指定〕
|問合せ名〔〔AS〕相関名〕〔使用インデクスのSQL最適化指定〕
|(結合表)
|導出表〔〔AS〕相関名〔(導出列リスト)〕〕}
- 認可識別子
-
表の所有者の認可識別子を指定します。データディクショナリ表を検索する場合は,認可識別子にMASTERを指定します。
- 表識別子
-
検索する表の名称を指定します。
- 〔IN (RDエリア名指定)〕
-
- IN
-
アクセス対象のRDエリアを指定します。指定できない場合を次に示します。
-
表識別子に指定した表が読み込み専用のビュー表の場合
-
ビュー定義の導出問合せ式中の場合
-
表識別子に指定した表が一時表の場合
-
- RDエリア名指定::=値指定
-
表識別子に指定した表を格納しているRDエリアのうち,アクセスするRDエリアの名称をVARCHAR型,CHAR型,MVARCHAR型,又はMCHAR型の値指定で指定します。複数のRDエリア名を指定する場合はコンマ(,)で区切って指定してください。RDエリア名は重複して指定できません。重複して指定した場合はエラーとなります。値指定で指定するRDエリア名に許される文字については,「名前の指定」を参照してください。また,値指定で指定したRDエリア名の前後の空白は無視されます。RDエリア名を引用符(")で囲んだ場合は,引用符(")の外側の空白だけを無視します。
インナレプリカ機能を適用しているRDエリアを指定する場合,オリジナルRDエリア名を指定してください。レプリカRDエリアを対象とする場合は,カレント切り替えコマンド(pddbchgコマンド),又はクライアント環境定義のPDDBACCSオペランドでアクセス対象RDエリアをレプリカRDエリアに切り替えてください。
- 問合せ名
-
検索の対象となるWITH句中の導出問合せ式から導出される表の名称を指定します。
- 〔AS〕相関名
-
同じ表を結合する場合,又は内側の副問合せで同じ表の列を参照する場合に,表同士を区別するために付ける名称を指定します。ASは省略できます。
一つのFROM句中で同じ表,又は問合せ名を複数回指定する場合は,相関名を指定してそれぞれの表,及び問合せ名が一意に識別できるようにしてください。また,問合せ名と表名が同じ場合も,相関名を指定して一意に識別できるようにしてください。
相関名には一つのFROM句中に指定したほかの相関名と同じ名称を指定できません。
相関名には,一つのFROM句中に指定したその相関名を指定する表名,又は問合せ名以外の表識別子と同じ名称を指定できません。
該当する相関名を指定する表名,又は問合せ名と同一名称の相関名を指定した場合,そのFROM句中に指定した相関名指定のある表名,又は問合せ名は有効範囲がありません。
相関名の有効範囲は,導出表を介さないでその相関名を指定した表参照をFROM句に含む問合せ指定,1行SELECT,及びそれらの内側の副問合せとします。
- 使用インデクスのSQL最適化指定
-
使用インデクスのSQL最適化指定については「SQL最適化指定」を参照してください。
- (結合表)
-
結合表の評価順序を指定する場合,結合表を括弧で囲んで指定します。括弧で囲まない場合は,最も左側の表参照から順に評価します。
-
結合表::={表参照〔{INNER|{LEFT|RIGHT} 〔OUTER〕}〕 JOIN
〔結合方式のSQL最適化指定〕
表参照 ON 探索条件
|表参照 CROSS JOIN 表一次子}
結合表には,内結合,外結合又は交差結合によって導き出される表を指定します。
内結合では,右側の表と左側の表から一つずつ行を取り出して組み合わせた行のうち,探索条件を満たす行が検索されます。外結合では,外表のすべての行と,探索条件を満たす内表の行が検索されます。交差結合では,右側の表と左側の表から一つずつ行を取り出して組み合わせた行が検索されます。
- 表参照〔{INNER|{LEFT|RIGHT} 〔OUTER〕}〕 JOIN 表参照
-
外表と内表の二つの表を突き合わせ処理する(内結合又は外結合する)場合に指定します。
「表参照1 〔INNER〕 JOIN 表参照2」の場合,「〔INNER〕 JOIN」の左側に指定する表参照の結果の表(表参照1)が外表となり,右側に指定する表参照の結果の表(表参照2)が内表となります。このときの突き合わせの結果のうち,探索条件を満たす行が導き出されます。
「表参照1 LEFT 〔OUTER〕 JOIN 表参照2」の場合,「LEFT 〔OUTER〕 JOIN」の左側に指定する表参照の結果の表(表参照1)が外表となり,右側に指定する表参照の結果の表(表参照2)が内表となります。外表の行は,突き合わせの結果の真偽に関係なくすべて導き出されます。また,内表の行は,探索条件を満たす行だけ導き出されます。
「表参照1 RIGHT 〔OUTER〕 JOIN 表参照2」の場合,「RIGHT 〔OUTER〕 JOIN」の右側に指定する表参照の結果の表(表参照2)が外表となり,左側に指定する表参照の結果の表(表参照1)が内表となります。外表の行は,突き合わせの結果の真偽に関係なくすべて導き出されます。また,内表の行は,探索条件を満たす行だけ導き出されます。
- 結合方式のSQL最適化指定
-
結合方式のSQL最適化指定については「SQL最適化指定」を参照してください。
- ON 探索条件
-
内結合又は外結合の結合条件を指定します。
探索条件には,外表又は内表の列が指定できます。
また,副問合せ中の探索条件の列指定は,副問合せの外側で指定した表の列を参照できます。問合せが入れ子の場合,内側の問合せから外側の問合せで指定している表,又は列を参照することを外への参照といいます。
探索条件中の列指定を表名で修飾する場合,相関名を指定した表の列に対しては相関名で修飾してください。
副問合せ中のON探索条件にCOUNT(*),COUNT_FLOAT(*),及びウィンドウ関数は指定できません。また,HAVING句に属するFROM句のON探索条件中にだけ,ON探索条件に集合関数を指定できます。HAVING句に属するFROM句のON探索条件中に集合関数を指定した場合,その集合関数の列指定は,HAVING句に先行するFROM句に指定した表を参照(外への参照)してください。
- 表参照 CROSS JOIN 表一次子
-
左側に指定した表参照と右側に指定した表一次子との直積を求める場合に指定します。
-
導出表〔〔AS〕相関名〔(導出列リスト)〕〕
表副問合せを指定します。この問合せで導き出された表をFROM句の導出表と呼びます。表副問合せのn番目の列が導出表のn番目の列となります。
導出表を含む問合せ指定は読み込み専用となります。
導出表を指定する場合の留意事項を次に示します。
-
表参照に導出表を指定した場合,導出表に対する相関名を指定してください。ただし,最も外側の問合せに次に示す形式を指定した場合だけ,〔AS〕相関名〔(導出列リスト)〕を省略できます。
-
SELECT COUNT(*) FROM 導出表
-
SELECT COUNT_FLOAT(*) FROM 導出表
-
-
値式を選択式に指定した表副問合せの結果導出される表の構成列に次の構造,又はデータ型を指定できません。
-
繰返し構造
-
BLOB
-
32,001バイト以上のBINARY
-
BOOLEAN
-
抽象データ型
-
-
導出表に対して行インタフェース(ROW)は指定できません。
-
導出表中にはウィンドウ関数を指定できません。
-
導出表中には予備列を指定できません。
- 〔AS〕相関名
-
導出表の名称を指定します。
- 〔(導出列リスト)〕
-
導出表の各列の列名を指定します。
導出列リストを省略した場合,導出表中の最も外側の問合せの結果導出される列名が導出表の列名となります。したがって,選択式の列指定(AS句を指定している場合AS句の列名)が導出表の列名となります。それ以外は,HiRDBがSQL文中のどの列名とも異なる列名を仮定します。
導出列リストを省略した場合,表副問合せの結果,導出される列名が重複してはいけません。
同じ列名は導出列リスト中に指定できません。
導出列リストを指定する場合,導出列リスト中の列名の数は,導出表によって導出された表の列数と同じにしてください。
導出列リスト中又は表副問合せによって導出される列数は,30,000以下にしてください。
(4) 共通規則
RDエリア名指定を指定した場合,分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は,分割数が表の分割数と等しいインデクスを定義してください。
(5) 結合表についての規則
-
外結合を指定した場合,外結合の結果の内表の列にはナル値を指定できるようになります。
-
「ON 探索条件」に指定できる列は,外表若しくは内表の列,又は外への参照列です。
-
結合表は,読み込み専用の表とします。
-
内結合によって導き出される表は,外表と内表のON 探索条件を満たす行を連結したもので構成されます。
-
外結合によって導き出される表は,外表と内表のON 探索条件を満たす行を連結したものと,外表のON 探索条件を満たさない行に内表の列数分のナル値を追加したもので構成されます。
-
結合表を含む問合せ指定の場合,外結合の内表から導き出される選択式には,ROWは指定できません。
(6) FROM句の導出表についての規則
-
FROM句導出表の選択式には,ROWは指定できません。
-
FROM句の導出表の選択式には,添字のない繰返し列は指定できません。
-
FROM句の導出表には,予備列は指定できません。
-
FROM句の導出表の選択式には,WRITE指定及びGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。
-
〔AS〕相関名〔(導出列リスト)〕を省略できる形式(SELECT COUNT(*) FROM 導出表又はSELECT COUNT_FLOAT(*) FROM 導出表)は,WITH句問合せ,ビュー定義,集合演算,INSERT文,及び副問合せに指定できません。
-
FROM句の導出表を指定すると,内部的に作業表を作成します。ただし,FROM句の導出表に関する次のすべての条件を満たす場合は作業表を作成しません。
-
FROM句の導出表の条件
・DISTINCTを指定していない
・選択式に副問合せを指定していない
・選択式にBINARY型の列を指定していない
・選択式にコンポネント指定がない
・FROM句に1表だけを指定している
・GROUP BY句,HAVING句,及び集合関数を指定していない
・集合演算を指定していない
・外への参照がある副問合せを指定していない
-
FROM句の導出表の外側の問合せの条件
・導出表を含む問合せ指定で,外結合の内表として使用していない
・導出表の選択式に列指定以外の値式がある場合,その値式から導出される列指定を,導出表を含む問合せ指定のGROUP BY句に指定していない
・ORDER BY句に指定している導出表のすべての列指定を,選択式に指定している
-
SQL文全体に対する条件
・プラグイン関数を指定していない
・SQL/XMLスカラ関数,SQL/XML述語,及びSQL/XML集合関数を指定していない
-
(7) 留意事項
-
FROM句中で指定した相関名,相関名なしで指定した表名,又は問合せ名の有効範囲は,そのFROM句を含む最も内側の副問合せ,問合せ指定,又は1行SELECT文中です。なお,それらの内側の副問合せも含みます。
-
副問合せ中のFROM句で相関名を指定すると,表名,又は問合せ名は,有効範囲がありません。
-
最も外側の問合せ指定,1行SELECT文に直接含まれるFROM句で相関名を指定した場合の表名,又は問合せ名の有効範囲は,内側の副問合せを除いて,問合せ指定,又は1行SELECT文中です。ただし,FROM句の表名,又は問合せ名に対して同一名称の相関名を指定した場合,そのFROM句中に指定した相関名指定のある表名,又は問合せ名は有効範囲がありません。
- 相関名,表名,又は問合せ名の有効範囲の例を次の図に示します。
-
副問合せ中のFROM句に指定した表名,又は問合せ名に相関名がある場合,その表名,又は問合せ名は有効範囲がありません(図中のT3)。また,自分の問合せで直接指定した相関名のある表(図中のT2 X)を内側の問合せが参照する場合,列名は表名(T2)ではなく,相関名(X)で修飾してください。
図2‒1 相関名,表名,又は問合せ名の有効範囲の例 同じ名称の有効な相関名,表名,又は問合せ名が複数ある範囲でその名称を参照した場合,最も局所的な有効範囲を持つものが指定されます。このとき,外側の表を参照するには,FROM句で異なる相関名を指定し,その名称で参照してください。
図2‒2 相関名,表名,又は問合せ名の有効範囲の例(FROM句の表名,又は問合せ名に対して同一名称の相関名を指定した場合) FROM句の表名,又は問合せ名に対して同一名称の相関名を指定した場合,そのFROM句中に指定した相関名指定のある表名,又は問合せ名は有効範囲がありません。
-
FROMの導出表を指定した場合の相関名,表名,有効範囲の例を次の図に示します。
図2‒3 FROMの導出表を指定した場合の相関名,表名,有効範囲の例