7.2.1 問合せ指定の指定形式および規則
問合せ指定には,検索結果として出力する項目(選択リスト)と表の検索条件(表式)を指定します。
- 〈この項の構成〉
(1) 指定形式
問合せ指定::=SELECT 〔{ALL|DISTINCT}〕〔SELECT重複排除方式指定〕 選択リスト 表式 SELECT重複排除方式指定::=/*>> SELECT DISTINCT NOT BY HASH <<*/ 選択リスト::={*|選択式〔,選択式〕…} 選択式::={値式 〔AS句〕|NULL 〔AS句〕|表指定.*|〔表指定.〕ROW} AS句::=〔AS〕 列名
(2) 指定形式の説明
(a) {ALL|DISTINCT}
検索結果に重複行があった場合,検索結果から重複行を排除するかどうかを指定します。
- ALL:
-
検索結果に重複行があっても,そのまま出力します。
- DISTINCT:
-
検索結果に重複行があった場合,重複を排除して検索結果を出力します。
DISTINCTを指定した場合と指定しない場合の検索結果の違いについては,「1.10.1 例(商品を購入した顧客を検索する)」を参照してください。
注意事項を次に示します。
-
DISTINCTを指定した場合,作業表が作成されることがあります。作業表が作成される作業表用DBエリアの容量が正しく見積もられていない場合,性能低下の原因となることがあります。作業表用DBエリアの容量見積もりについては,マニュアルHADB システム構築・運用ガイドを参照してください。作業表の詳細については,マニュアルHADB AP開発ガイドの作業表が作成されるSQLを実行する際の考慮点を参照してください。
-
SELECT DISTINCTの処理方式にハッシュ実行が適用された場合,適切な大きさのハッシュテーブル領域が必要になります。ハッシュテーブル領域の大きさはサーバ定義またはクライアント定義のadb_sql_exe_hashtbl_area_sizeオペランドで指定します。SELECT DISTINCTの処理方式については,マニュアルHADB AP開発ガイドのSELECT DISTINCTの処理方式を参照してください。
-
ALLおよびDISTINCTの指定を省略した場合,ALLが仮定されます。
(b) SELECT重複排除方式指定
SELECT重複排除方式指定を指定した場合,SELECT DISTINCTの処理方式にハッシュ実行以外の処理方式が適用されます。SELECT DISTINCTの処理方式については,マニュアルHADB AP開発ガイドのSELECT DISTINCTの処理方式を参照してください。
なお,通常は,この指定をする必要はありません。SELECT重複排除方式指定を省略した場合,HADBがSELECT DISTINCTの処理方式を決定します。
(c) 選択リスト
選択リスト::={*|選択式〔,選択式〕…}
選択リストには,検索結果として出力する項目を指定します。
- *:
-
表のすべての列を検索結果として出力する場合に指定します。
*を指定した場合,FROM句に指定したすべての表のすべての列を,FROM句で指定した表の順序で指定したと見なされます。各表中の列の順序は,表定義時に指定した順序となります。
- 選択式〔,選択式〕…:
-
検索結果として出力する項目を指定します。
(d) 表式
検索対象となる表を指定します。また,表を検索するときの条件(探索条件),グループ分け,およびグループを選択する条件が指定できます。表式の詳細については,「7.4 表式」を参照してください。
(e) 選択式
選択式::={値式 〔AS句〕|NULL 〔AS句〕|表指定.*|〔表指定.〕ROW} AS句::=〔AS〕 列名
選択式には,検索結果として出力する項目を指定します。
選択式中に外への参照列を指定することはできません。外への参照列については,「7.3.1 副問合せの指定形式および規則」の「(4) 規則」の「(a) 副問合せ共通の規則」を参照してください。
- 値式 〔AS句〕:
-
検索結果として出力する項目を値式の形式で指定します。
検索結果の列名を変更する場合はAS句を指定します。
検索結果の列名および列順については,「6.9 導出列名」を参照してください。
指定規則を次に示します。
-
最初の問合せ指定(SELECT文のWITH句中の問合せ指定を除く)の場合,AS句中の列名に半角括弧(左括弧または右括弧)を指定できます。2番目以降の問合せ指定の場合は,AS句中の列名に半角括弧を指定できません。
-
HADBによって自動的に設定される導出列名と重複する可能性があるため,AS句の列名にEXPnnnn_NO_NAMEを指定しないでください。nnnnは,0000~9999の符号なし整数です。
-
DISTINCTを指定する場合,選択式の値式には配列データを指定できません。
■GROUP BY句,HAVING句,または集合関数を指定する場合の注意事項
GROUP BY句,HAVING句,または集合関数を指定する場合,選択式中の値式に指定する列指定は,次のどれかの条件を満たす必要があります。
-
グループ化列名を指定する
(例)正しいSQL文の例
SELECT "C1" FROM "T1" GROUP BY "C1" HAVING "C1">100
上記の例では,GROUP BY句に指定したグループ化列名を,選択式中の値式に指定しています。
-
集合関数の引数に指定する
(例)正しいSQL文の例
SELECT COUNT("C2") FROM "T1" HAVING MAX("C1")>100
上記の例では,集合関数の引数に列指定を指定しています。
(例)エラーになるSQL文の例
SELECT COUNT("C1")+"C1" FROM "T1"
上記の例では,集合関数の引数以外の個所に列指定を指定しています。
-
グループ化指定に指定した値式(列指定を含む値式)と同じ値式を指定する
(例)正しいSQL文の例
SELECT "C1"+"C2" FROM "T1" GROUP BY "C1"+"C2"
上記の例では,GROUP BY句のグループ化指定に指定した値式(列指定を含む値式)と同じ値式を,選択式中の値式に指定しています。
なお,選択式に表指定ありの列指定を指定した場合,グループ化列名に同じ名称の列名があっても,そのグループ化列は参照できません。
(例)エラーになるSQL文の例
SELECT "T1"."C2" FROM "T1" GROUP BY "C1"+1 AS "C2"
上記の例では,選択式に表指定ありの列指定("T1."C2")を指定しているため,グループ化列名に同じ列名の「"C1"+1 AS "C2"」があっても参照できません。そのため,上記のSQL文はエラーになります。
-
- NULL 〔AS句〕:
-
検索結果にナル値を出力する場合に指定します。
検索結果に列名を付与する場合はAS句を指定します。
指定規則を次に示します。
-
SELECT文の最も外側の問合せ指定の選択式にだけNULLを指定できます。
-
集合演算の対象となる問合せ指定の選択式にはNULLを指定できません。
(例)エラーになるSQL文の例
SELECT NULL FROM "T1" UNION SELECT "C1" FROM "T1"
-
WITH句中の問合せ指定の選択式にはNULLを指定できません。
検索結果については,次の規則が適用されます。
-
NULLの結果のデータ型はINTEGER型になります。
-
NULLの結果は,非ナル値制約なし(ナル値を許す)となります。
-
- 表指定.*:
-
この指定をした場合,指定した表の全列が検索結果として出力されます。検索結果の列順は,指定した表の列順と同じになります。
この指定をした場合,その問合せ指定中にGROUP BY句,HAVING句,または集合関数を指定したときは,選択式中に含まれる列指定は次のようにしてください。
-
グループ化列
-
- 〔表指定.〕ROW:
-
この指定をした場合,行全体を1つのデータとして1つの領域に取り出します。ROWは行全体を意味しています。
取り出されるデータに指定する変数は,各列のデータ型に関係なく,ROWに対応するCHAR型の変数を指定します。ただし,変数中に境界調整による空きがないようにしてください。また,データ長は行長(各列のデータ長の合計)になります。行長の計算方法については,マニュアルHADB システム構築・運用ガイドの行の種別ごとの格納ページ数の求め方の計算式ROWSZを参照してください。
ROWを指定する場合の規則を次に示します。
-
FIX表に対してだけ指定できます。
-
ROWを指定する場合,その問合せ指定中に次の指定はできません。
・集合関数
・ウィンドウ関数
・GROUP BY句
・SELECT DISTINCT
・集合演算
-
FROM句に結合表のLEFT OUTER JOINを指定した場合,右側の表にはROWを指定できません。
-
FROM句に結合表のRIGHT OUTER JOINを指定した場合,左側の表にはROWを指定できません。
-
FROM句に結合表のFULL OUTER JOINを指定した場合,両側の表にはROWを指定できません。
-
WITH句中の問合せ指定にROWを指定できません。
-
(3) 実行時に必要な権限
問合せ指定を実行する場合,問合せ指定中で指定する表に対するSELECT権限が必要になります。
(4) 規則
-
問合せ指定の検索結果の列の数は,4,000以下にしてください。
-
選択式に表指定.*,または表指定.ROWを指定する場合,その選択式を有効範囲に含む範囲変数と等価な表指定としてください。
-
問合せ指定中にアーカイブマルチチャンク表を指定する場合,探索条件の指定に注意する必要があります。詳細については,マニュアルHADB AP開発ガイドのアーカイブマルチチャンク表を検索する際の考慮点を参照してください。問合せ指定中にアーカイブマルチチャンク表を指定する場合は,必ず参照してください。
-
次の述語をB-treeインデクスを使用して評価する場合,表副問合せに指定された問合せ指定は,SELECT DISTINCTの指定があるものとして処理されることがあります。
-
表副問合せが指定されたIN述語
-
限定述語(=ANY指定または=SOME指定)
-
-
集合演算にDISTINCTを指定した場合,その集合演算中の問合せ指定は,SELECT DISTINCTの指定があるものとして処理されることがあります。
(5) 例題
問合せ指定の指定例を例題を使って説明します。
- 例題
-
販売履歴表(SALESLIST)から,2011/9/3以降の商品コード(PUR-CODE)ごとの販売個数の合計値,平均値を求めます。その際,販売個数の合計値が20個以下の商品コードだけを検索対象にします。
SELECT "PUR-CODE",SUM("PUR-NUM"),AVG("PUR-NUM") ...1 FROM "SALESLIST" ...2 WHERE "PUR-DATE">=DATE'2011-09-03' ...2 GROUP BY "PUR-CODE" ...2 HAVING SUM("PUR-NUM")<=20 ...2
説明
この例では,SELECT文全体が問合せ指定です。
-
下線部分が選択リストの指定です。
-
下線部分が表式の指定です。
-