Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.11.1 表参照の指定形式

表参照には検索対象の表を指定します。表参照はFROM句中に指定します。

なお,同じ表を結合した検索を行う場合は,相関名を指定します。

〈この項の構成〉

(1) 指定形式

表参照::={表一次子結合表表一次子::={表名 〔〔AS〕 相関名〕〔インデクス指定〕
                |問合せ名 〔〔AS〕 相関名〕
                |導出表 〔〔AS〕 相関名 〔(導出列リスト)〕〕
                |表関数導出表 〔AS〕 相関名 〔(表関数列リスト)〕集まり導出表 〔AS〕 相関名 〔(導出列リスト)〕
                |(結合表)}
 
    導出表::={表副問合せ|(表値構成子)}
    表関数導出表::=TABLE(システム定義関数)
    集まり導出表::=UNNEST(列指定〔,列指定〕…)
 
    導出列リスト::=列名〔,列名〕…
    表関数列リスト::=列名 データ型〔,列名 データ型〕…

(2) 指定形式の説明

表名

検索対象の表を指定します。表名の指定規則については,「6.1.5 名前の修飾」の「(2) 表名の指定形式」を参照してください。

ディクショナリ表またはシステム表を検索する場合は,スキーマ名にMASTERを指定してください。

なお,アーカイブマルチチャンク表を指定した場合,ロケーション表およびシステム表(STATUS_CHUNKS)に対するアクセスが発生します。その際,システム表(STATUS_CHUNKS)の排他資源が確保されます。排他制御の詳細については,マニュアルHADB システム構築・運用ガイド排他制御を参照してください。

AS〕 相関名

次に示す場合に,表同士を区別するために付ける名称を指定します。

  • 同じ表を結合する場合

  • 内側の副問合せで同じ表の列を参照する場合

留意事項を次に示します。

  • 表関数導出表または集まり導出表を指定する場合は,相関名を指定する必要があります。

  • 1つのFROM句中で同じ範囲変数を複数回指定する場合は,相関名を指定してそれぞれの範囲変数が一意に識別できるようにしてください。

  • 相関名には,1つのFROM句中に指定したほかの範囲変数と同じ名称を指定できません。また,ほかの範囲変数の表識別子と同じ名称も指定できません。範囲変数の有効範囲については,「6.8 範囲変数」を参照してください。

  • ASの指定のありなしに関係なく結果は同じになります。

  • 導出表の相関名を省略した場合,次の名称規則に従って自動的に相関名が付けられます。

    ##ADD_DRVTBL_xxxxxxxxxx

    xxxxxxxxxxは10桁の整数です。この相関名は,アクセスパスの実行結果で表示されます。

    有効範囲が同じになる表参照では,##ADD_DRVTBL_から始まる表名,および相関名を指定しないでください。

    メモ

    HADBサーバによって自動的に付けられた相関名が重複することがあります。

インデクス指定

実表の検索時に使用するB-treeインデクスまたはテキストインデクスを指定します。または,B-treeインデクスまたはテキストインデクスの使用抑止を指定します。インデクス指定については,「7.14 インデクス指定」を参照してください。

問合せ名

問合せ名を指定します。問合せ名については,「7.1.1 問合せ式の指定形式および規則」の「(2) 指定形式の説明」の「(a) WITH句」を参照してください。

導出表

導出表を表副問合せまたは表値構成子の形式で指定します。表副問合せについては,「7.3 副問合せ」を参照してください。表値構成子については,「7.17 表値構成子」を参照してください。

導出表とは,表副問合せまたは表値構成子の結果,導出された表のことです。表副問合せまたは表値構成子のn番目の列が,導出表のn番目の列になります。

導出表を含む問合せ指定は,その導出表を含まない等価な問合せ指定に変換されます。

導出表の相関名(相関名を省略した場合はHADBサーバが生成した相関名)を導出問合せ名,導出表の問合せ式を導出問合せ式とした場合,内部導出表の適用規則によって,その導出問合せ式が内部導出表として扱われます。内部導出表の適用規則については,「7.31 内部導出表」を参照してください。

留意事項を次に示します。

  • 導出表の相関名を省略した場合,その導出表の範囲変数は有効範囲を持ちますが,名称がありません(HADBサーバが内部的に名称を生成するため,ユーザはその名称を確認できません)。したがって,同じ有効範囲内に同じ列名を持つ表参照が複数ある場合は,相関名を指定するようにしてください。

    (例)エラーになるSQL文の例

    SELECT "C1" FROM "T1",(SELECT "C1" FROM "T1")

    下線部分の列C1は,同じ有効範囲内に同じ列名を持つ表参照が複数あります(表T1と導出表)。上記の場合,下線部分の列C1が,表T1の列C1なのか,導出表の列C1なのかが特定できないため,SQL文がエラーになります。そのため,導出表の列を参照する場合は,導出表に相関名を指定し,その相関名で列名を修飾してください。例を次に示します。

    (例)正しいSQL文の例

    SELECT "DT1"."C1" FROM "T1",(SELECT "C1" FROM "T1") AS "DT1"
  • 導出表に対して行インタフェース(ROW)は指定できません。

導出列リスト

導出表または集まり導出表の各列の列名を指定します。導出列リストは,次に示す形式で指定します。

列名〔,列名〕…

導出列リストを指定した場合と,導出列リストの指定を省略した場合で,導出される表の列名が異なります。導出される列名の規則については,「6.9 導出列名」を参照してください。

留意事項を次に示します。

  • 導出列リストの指定を省略した場合,導出される列名が重複しないようにしてください。

  • 導出列リスト中に,同じ列名は指定しないでください。

  • HADBによって自動的に設定される導出列名と重複する可能性があるため,導出列リストの列名にEXPnnnn_NO_NAMEを指定しないでください。nnnnは,00009999の符号なし整数です。

  • 導出列リストを指定する場合,導出列リスト中の列名の数は,導出表または集まり導出表によって導出され表の列数と同じになるようにしてください。

  • 導出列リストに指定する列数は,1,000以下にしてください

表関数導出表
表関数導出表::=TABLE(システム定義関数)

表関数導出表とは,システム定義関数によって導出される表形式のデータ集合のことです。システム定義関数については,「7.15 システム定義関数」を参照してください。

表関数導出表の指定規則を次に示します。

  • 表参照に表関数導出表を指定した場合,表関数導出表に対する相関名を指定してください。

  • 表関数導出表に対して行インタフェース(ROW)は指定できません。

表関数列リスト
表関数列リスト::=列名 データ型〔,列名 データ型〕…

表関数導出表の各列の列名とデータ型を指定します。

表関数列リストの指定規則を次に示します。

  • 表関数導出表にADB_AUDITREAD関数を指定した場合,表関数列リストは指定できません。

  • 表関数導出表にADB_CSVREAD関数を指定した場合,表関数列リストを必ず指定してください。

  • データ型の指定形式については,「表3‒8 指定できるデータ型(CREATE TABLE文の場合)」を参照してください。

  • 表関数列リスト中に同じ列名は指定できません。

  • HADBによって自動的に設定される導出列名と重複する可能性があるため,表関数列リストの列名にEXPnnnn_NO_NAMEを指定しないでください。nnnnは,00009999の符号なし整数です。

  • 表関数列リストの列名の数は,1,000個以下にしてください。

  • 表関数列リストデータ型には,データ長が32,000バイトを超えるVARCHAR型を指定できません。

  • 表関数列リストのデータ型には,配列型を指定できません。

  • 表関数列リストのデータ型にNUMERIC型が指定された場合,HADBはDECIMAL型が指定されたと見なします。

  • 表関数列リストのデータ型にFLOAT型が指定された場合,HADBはDOUBLE PRECISION型が指定されたと見なします。

導出される列名の規則については,「6.9.2 問合せの結果の導出列名の決定規則」の「(4) 表関数導出表の場合」を参照してください。

集まり導出表
集まり導出表::=UNNEST(列指定〔,列指定〕…)

集まり導出表には,列指定を指定します。列指定に指定した配列データの各配列要素の値を列値とする行が生成され,その行の集合が集まり導出表の結果になります。集まり導出表の結果のn番目の列が,集まり導出表のn番目の列になります。列指定の指定形式については,「6.1.5 名前の修飾」の「(5) 列指定の指定形式」を参照してください。

指定規則を次に示します。

  • 列指定には,配列型の列を指定してください。

  • 列指定の数は1,000以下にしてください。

  • 列指定には,次のすべての条件を満たす実表の列を指定してください。

    • 集まり導出表と同じFROM句に指定している実表

    • 集まり導出表とコンマ結合している実表

    • 集まり導出表よりも左側に指定している実表

  • 列指定を複数指定する場合,異なる表の列は指定できません。

集まり導出表の左側に指定した表と集まり導出表のコンマ結合の結果は,左側に指定した表の各行に対して,集まり導出表の結果の各行を組み合わせて連結した行の集合になります。

(例)

[図データ]

このとき,集まり導出表の結果は,次の流れで導出されます。

  1. i 番目の列指定が参照する配列データの各配列要素に対して,それをi 番目の列値とする行を,列指定の中で配列要素数が最大となる配列データの配列要素数分だけ生成します。このとき,次の規則が適用されます。

    • 列指定の中で配列要素数が最大となる配列要素数をNmaxとします。配列要素数がNmax未満となるj 番目の列指定の配列要素数をNjとする場合,j 番目の列指定の配列データの「Nj+1Nmax」番目の配列要素にはナル値が補完されます。

    • すべての列指定が参照する配列データが,ナル値または空の配列データの場合,行は生成されません。

  2. 生成された行の集合が,集まり導出表の結果になります。

    (例)"T1", UNNEST("T1"."C1","T1"."C2")と指定した場合

    C1列とC2列は,要素データ型がINTEGER型で,最大要素数が10の配列型の列とします。

    [図データ]

集まり導出表の左側に指定した表と集まり導出表のコンマ結合の結果の例を次に示します。

例で使用する表T1は次のとおりとします。

[図データ]

  • 集まり導出表に指定する列指定が1つの場合

    (例1)
    FROM "T1",UNNEST("T1"."C2") AS "T2"("DC2")

    下線部分が集まり導出表の指定です。

    <上記のFROM句の結果>

    [図データ]

    (例2)
    FROM "T1",UNNEST("T1"."C3") AS "T2"("DC3")

    下線部分が集まり導出表の指定です。

    <上記のFROM句の結果>

    [図データ]

    (例3)
    FROM "T1",UNNEST("T1"."C2") AS "T2"("DC2"),UNNEST("T1"."C3") AS "T3"("DC3")

    下線部分が集まり導出表の指定です。

    <上記のFROM句の結果>

    [図データ]

  • 集まり導出表に指定する列指定が複数の場合

    (例)
    FROM "T1",UNNEST("T1"."C2","T1"."C3") AS "T2" ("DC2","DC3")

    下線部分が集まり導出表の指定です。

    <上記のFROM句の結果>

    [図データ]

結合表

結合表を指定します。結合表については,「7.12 結合表」を参照してください。

(3) 例題

表参照の指定例を例題を使って説明します。

例題1

販売履歴表(SALESLIST)から,2011/9/6以降に商品を購入した顧客の,顧客ID(USERID),商品コード(PUR-CODE),購入日(PUR-DATE)を検索します。

SELECT "USERID","PUR-CODE","PUR-DATE"
    FROM "SALESLIST"
        WHERE "PUR-DATE">=DATE'2011-09-06'

下線部分が表参照の指定です。

例題2

販売履歴表(SALESLIST)に定義されているインデクス名(INDEX_NAME)を調べるためにディクショナリ表(SQL_INDEXES)を検索します。

SELECT "INDEX_NAME"
    FROM "MASTER"."SQL_INDEXES"
        WHERE "TABLE_NAME"='SALESLIST'

下線部分が表参照の指定です。ディクショナリ表を検索する場合は,スキーマ名MASTERで表名を修飾する必要があります。

例題3

販売履歴表(SALESLIST)に定義されているインデクス名(INDEX_NAME)を調べるためにディクショナリ表(SQL_INDEXES)を検索します。相関名としてIDXを使用しています。

SELECT "IDX"."INDEX_NAME"
    FROM "MASTER"."SQL_INDEXES" AS "IDX"
        WHERE "IDX"."TABLE_NAME"='SALESLIST'

下線部分が表参照の指定です。

例題4

顧客ID列(USERID)を探索条件にした販売履歴表(SALESLIST)および顧客表(USERSLIST)の結合表から,顧客ID(USERID),商品コード(PUR-CODE),顧客名(NAME)および性別(SEX)を検索します。

SELECT "SALESLIST"."USERID","PUR-CODE","NAME","SEX"
    FROM ("SALESLIST" JOIN "USERSLIST"
           ON "USERSLIST"."USERID"="SALESLIST"."USERID")

下線部分が表参照の指定です。

例題5

GZIP形式で圧縮したCSVファイル(/dir/file.csv.gz)から,次のデータを取り出します。

  • 顧客ID(USERID

  • 顧客名(NAME

  • 年齢(AGE

SELECT "USERID","NAME","AGE"
    FROM TABLE(ADB_CSVREAD(MULTISET ['/dir/file.csv.gz'],
                          'COMPRESSION_FORMAT=GZIP;'))
         AS "USERLIST" ("USERID" CHAR(5),
                        "NAME" VARCHAR(100),
                        "AGE" INTEGER,
                        "COUNTRY" VARCHAR(100),
                        "INFORMATION" VARBINARY(10))

下線部分が表参照の指定です。

例題6

顧客表(USERSLIST)の関心事リスト列(INTEREST-LIST)を検索して,ファッションに興味を持っている顧客の顧客ID(USERID)を検索します。

関心事リスト列(INTEREST-LIST)は配列型の列で,配列要素には顧客が興味を持っている分野についての情報が格納されています。

SELECT "USERID"
    FROM "USERSLIST",UNNEST("INTEREST-LIST") "CDT"("INTEREST")
        WHERE "CDT"."INTEREST" = 'fashion'

下線部分が表参照の指定です。