スケーラブルデータベースサーバ HiRDB Version 8 SQLリファレンス

[目次][索引][前へ][次へ]

2.2.2 問合せ式 形式2(繰返し列平坦化問合せ式)

<この項の構成>
(1) 機能
(2) 形式
(3) オペランド
(4) 規則
(5) 指定例

(1) 機能

繰返し列を要素ごとに分割し,それぞれを別の行として検索できます。

また,複数の繰返し列の添字が等しい要素同士を,同じ行として検索できます。これを,繰返し列の平坦化機能といいます。

(2) 形式

 
         SELECT 〔ALL|DISTINCT〕{選択式〔,選択式〕 …|*}
          FROM〔〔RDノード名称.〕認可識別子.〕表識別子
                〔IN (RDエリア名指定)〕
                (FLAT(列名〔,列名〕 …))〔〔AS〕相関名〕
                〔使用インデクスのSQL最適化指定〕
                〔WHERE 探索条件〕
                〔GROUP BY 列指定〔,列指定〕…〕
                〔HAVING 探索条件
 

(3) オペランド

選択式,FLAT,及び探索条件以外のオペランドについては,「2.2.1 問合せ式 形式1(一般問合せ式)」を参照してください。

検索結果として出力する項目を指定します。

選択式については,「2.3 問合せ指定」を参照してください。

IN
アクセス対象のRDエリアを指定します。指定できない場合を次に示します。
  • 表識別子に指定した表が外部表の場合
  • 表識別子に指定した表が読み込み専用のビュー表の場合
  • ビュー定義の導出問合せ式中の場合

RDエリア名指定::=値指定
表識別子に指定した表を格納しているRDエリアのうち,アクセスするRDエリアの名称をVARCHAR型,CHAR型,MVARCHAR型,又はMCHAR型の値指定で指定します。複数のRDエリア名を指定する場合はコンマ(,)で区切って指定してください。RDエリア名は重複して指定できません。重複して指定した場合はエラーとなります。値指定で指定するRDエリア名に許される文字については,「1.1.7 名前の指定」を参照してください。また,値指定で指定したRDエリア名の前後の空白は無視されます。RDエリア名を引用符(")で囲んだ場合は,引用符(")の外側の空白だけを無視します。
インナレプリカ機能を適用しているRDエリアを指定する場合,オリジナルRDエリア名を指定してください。レプリカRDエリアを対象とする場合は,カレント切り替えコマンド(pddbchgコマンド),又はクライアント環境定義のPDDBACCSオペランドでアクセス対象RDエリアをレプリカRDエリアに切り替えてください。

平坦化の対象となる繰返し列又は,繰返し列を含む列の並びを指定します。

複数の繰返し列を指定した場合は,添字が等しい要素が同じ行に含まれるように平坦化されます。

通常の列(繰返し構造でない列)も含む場合は,繰返し列のどの要素に対しても同じ値を持つ行が生成されます。

繰返し列,又は繰返し列を含む列の組を平坦化した後は,通常の列になります。したがって,その問合せ式中では通常の列として指定します。

探索条件中には,平坦化した後の項目を指定できます。

探索条件については,「2.7 探索条件」を参照してください。

(4) 規則

  1. 平坦化する列とインデクスとの関係を次に示します。
    列名に指定した列とインデクスの関係 SQL文
    実行可否
    インデクス定義あり 繰返し列を含むインデクスがある FLATの列名に指定した列のうち,SQL中に指定した列をすべて包括したインデクスがある FLATの列名中に一つでも繰返し列が存在する
    FLATの列名中に一つも繰返し列が存在しない ×
    FLATの列名に指定した列のうち,SQL中に指定した列をすべて包括したインデクスがない ×
    繰返し列を含むインデクスがない ×
    インデクス定義なし ×
    (凡例)
       ○:実行可能 ×:エラー
  2. 使用インデクスのSQL最適化指定にWITHOUT INDEXを指定した場合,その最適化指定を無視し,HiRDBが使用できるインデクスを用いて検索します。
  3. 使用インデクスのSQL最適化指定にWITH INDEXを指定する場合,規則1に示したSQL文実行可能な条件を満たすインデクスを指定してください。指定したインデクスがSQL文実行可能な条件を満たしていない場合,その最適化指定を無視し,HiRDBが利用できるインデクスを用いて検索します。
  4. FROM句のFLAT指定は,INSERT SELECTのSELECT文,WITH句問合せ,ビュー定義,FROM句の導出表,及び副問合せ中には指定できません。
  5. FLATに指定できる列名は最大16個です。
  6. 平坦化を指定したSQL中で指定する列名には,FLATで指定した列名を指定してください。
  7. 表識別子には,ビュー表,外部表,及び表別名を指定できません。
  8. 平坦化を指定する場合,以下の項目を指定できません。
    • FOR UPDATE句
    • FOR READ ONLY
    • LIMIT句
    • コンポネント指定
    • 関数呼出し
    • 副問合せ
    • FLAT指定のある集合関数
    • 添字を指定した列
  9. 平坦化を指定する場合,探索条件中に以下の項目を指定できません。
    • 構造化繰返し述語
  10. RDエリア名指定を指定した場合,分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は,分割数が表の分割数と等しいインデクスを定義してください。

(5) 指定例

繰返し列を用いた成績表を平坦化し,成績が70点以上の学生の一覧を検索します。
 
SELECT 氏名,科目名,成績 FROM 成績表 (FLAT(氏名,科目名,成績))
    WHERE 成績>=70
 
[図データ]

成績表の表定義及びインデクス定義は次のとおりです。
表定義:
    CREATE TABLE 成績表(氏名 MCHAR(10),
                        科目名 MCHAR(10) ARRAY[4],
                        成績 SMALLINT ARRAY[4]);
インデクス定義:
    CREATE INDEX 科目成績 ON 成績表(氏名,科目名,成績);