7.11.1 表参照の指定形式
表参照には検索対象の表を指定します。表参照はFROM句中に指定します。
なお,同じ表を結合した検索を行う場合は,相関名を指定します。
- 〈この項の構成〉
(1) 指定形式
表参照::={表一次子|結合表} 表一次子::={表名 〔タイムトラベル指定〕 〔〔AS〕 相関名〕〔インデクス指定〕 |問合せ名 〔〔AS〕 相関名〕 |導出表 〔〔AS〕 相関名 〔(導出列リスト)〕〕 |表関数導出表 〔〔AS〕 相関名〕 〔{(表関数列リスト)|(導出列リスト)}〕 |集まり導出表 〔AS〕 相関名 〔(導出列リスト)〕 |(結合表)} タイムトラベル指定::= FOR {VERSION AS OF スナップショットID指定 |TIMESTAMP AS OF 時刻印指定} 導出表::={表副問合せ|(表値構成子)} 表関数導出表::={TABLE(システム定義関数)|システム定義関数} 集まり導出表::=UNNEST(列指定〔,列指定〕…) 導出列リスト::=列名〔,列名〕… 表関数列リスト::=列名 データ型〔,列名 データ型〕…
(2) 指定形式の説明
- 表名:
-
検索対象の表を指定します。表名の指定規則については,「6.1.5 名前の修飾」の「(2) 表名の指定形式」を参照してください。
ディクショナリ表またはシステム表を検索する場合は,スキーマ名にMASTERを指定してください。
なお,アーカイブマルチチャンク表を指定した場合,ロケーション表およびシステム表(STATUS_CHUNKS)に対するアクセスが発生します。その際,システム表(STATUS_CHUNKS)の排他資源が確保されます。排他制御の詳細については,マニュアルHADB システム構築・運用ガイドの排他制御を参照してください。
- タイムトラベル指定:
-
タイムトラベル指定::= FOR {VERSION AS OF スナップショットID指定 |TIMESTAMP AS OF 時刻印指定}Icebergテーブルを参照する外部表を検索する際,過去の状態(スナップショット)の外部データを検索する場合に指定します。どの時点のスナップショットを使用するかを,スナップショットIDまたは時刻印指定で指定します。指定したスナップショットに対応するスキーマおよび外部データが外部表に読み込まれます。
- 重要
-
CREATE FOREIGN TABLE文の外部データのデータ形式指定にICEBERGを指定して定義した外部表を,表名に指定している場合に限りタイムトラベル指定を指定できます。
- スナップショットID指定
-
検索対象とするスナップショットのスナップショットIDを指定します。スナップショットID指定には,1以上の符号なし整数定数を指定してください。
- 時刻印指定
-
検索対象とするスナップショットを日時を基準にして決めたい場合に指定します。時刻印指定で指定した日時(基準日時)以前の中で,最新のスナップショットが検索対象になります。時刻印指定には,次のどちらかの定数を指定してください。
-
小数秒精度が0または3の時刻帯付きの時刻印定数
(例)
TIMESTAMP'2025-12-30 20:03:58+09:00'
-
小数秒精度が0または3の時刻帯付きの時刻印を表す既定の入力表現の文字列定数
(例)
'2025-12-30 20:03:58+09:00'
上記の例の場合,UTCの2025年12月30日11時3分58秒が基準日時になり,基準日時以前の中で最新のスナップショットが検索対象になります。
-
留意事項を次に示します。
-
タイムトラベル指定に指定した条件のスナップショットが存在しないなど,スナップショットを取得できない場合はSQL文がエラーになります。
-
外部表の列定義(列名,列のデータ型などの定義)は,タイムトラベル指定によって決定されたスナップショットに対応するメタデータを使用して生成されます。「3.6.1 CREATE FOREIGN TABLE文の指定形式および規則」の「(5) 列定義の指定を省略した場合の規則」の「(a) 外部データのデータ形式指定にICEBERGを指定する場合」で説明している規則に従って外部表の列定義が生成されます。
-
ディクショナリ表(SQL_TABLES表,SQL_COLUMNS表,SQL_DATATYPE_DESCRIPTORS表)に格納されている外部表の列定義に関する情報は,外部表の定義時点のものです(外部表の検索時点のものではありません)。外部表の検索時には,タイムトラベル指定によって決定されたスナップショットに対応するメタデータを使用して外部表の列定義が生成されます。そのため,メタデータのスキーマに変更があった場合,ディクショナリ表に格納されている外部表の列定義に関する情報と,外部表の検索時に生成される外部表の列定義が不一致になります。
- 〔AS〕 相関名:
-
次に示す場合に,表同士を区別するために付ける名称を指定します。
-
同じ表を結合する場合
-
内側の副問合せで同じ表の列を参照する場合
留意事項を次に示します。
-
次の指定をする場合は,相関名を指定する必要があります。
-
ADB_AUDITREAD関数またはADB_CSVREAD関数を指定した表関数導出表
-
集まり導出表
-
-
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.33 内部導出表」を参照してください。
留意事項を次に示します。
-
導出表の相関名を省略した場合,その導出表の範囲変数は有効範囲を持ちますが,名称がありません(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は,0000~9999の符号なし整数です。
-
導出列リストを指定する場合,導出列リスト中の列名の数は,導出表,表関数導出表,または集まり導出表によって導出される表の列数と同じになるようにしてください。
-
導出列リストに指定する列数は,4,000以下にしてください。また,導出表,表関数導出表,および集まり導出表によって導出される表の列数は,4,000以下になるようにしてください。
-
ADB_AUDITREAD関数またはADB_CSVREAD関数を指定した表関数導出表には,導出列リストを指定できません。
-
- 表関数導出表:
-
表関数導出表::={TABLE(システム定義関数)|システム定義関数}
表関数導出表とは,システム定義関数によって導出される表形式のデータ集合のことです。システム定義関数については,「7.15 システム定義関数」を参照してください。
表関数導出表の指定規則を次に示します。
-
表関数導出表は,「TABLE(システム定義関数)」または「システム定義関数」のどちらかの形式で指定します。
-
システム定義関数にADB_AUDITREAD関数またはADB_CSVREAD関数を指定する場合は,「TABLE(システム定義関数)」の形式で指定してください。
-
システム定義関数にADB_GENERATE_SERIES関数を指定する場合は,「システム定義関数」の形式で指定してください。
-
-
表関数導出表に対して行インタフェース(ROW)は指定できません。
-
- 表関数列リスト:
-
表関数列リスト::=列名 データ型〔,列名 データ型〕…
表関数導出表の各列の列名とデータ型を指定します。
表関数列リストの指定規則を次に示します。
-
表関数導出表にADB_AUDITREAD関数を指定した場合,表関数列リストは指定できません。
-
表関数導出表にADB_CSVREAD関数を指定した場合,表関数列リストを必ず指定してください。
-
表関数導出表にADB_GENERATE_SERIES関数を指定した場合,表関数列リストは指定できません。
-
データ型の指定形式については,「6.2.1 データ型の種類」を参照してください。
-
表関数列リスト中に同じ列名は指定できません。
-
HADBによって自動的に設定される導出列名と重複する可能性があるため,表関数列リストの列名にEXPnnnn_NO_NAMEを指定しないでください。nnnnは,0000~9999の符号なし整数です。
-
表関数列リストの列名の数は,4,000個以下にしてください。
-
表関数列リストのデータ型には,データ長が32,000バイトを超えるVARCHAR型,およびSTRING型を指定できません。
-
表関数列リストのデータ型には,配列型およびSTRUCT型を指定できません。
-
整数データ型のデータ形式がレガシー形式の場合,表関数列リストのデータ型にBIGINT型が指定されると,HADBはINTEGER型が指定されたと見なします。
-
表関数列リストのデータ型にNUMERIC型が指定された場合,HADBはDECIMAL型が指定されたと見なします。
-
表関数列リストのデータ型にFLOAT型が指定された場合,HADBはDOUBLE PRECISION型が指定されたと見なします。
導出される列名の規則については,「6.9.2 問合せの結果の導出列名の決定規則」の「(4) 表関数導出表の場合」を参照してください。
-
- 集まり導出表:
-
集まり導出表::=UNNEST(列指定〔,列指定〕…)
集まり導出表には,列指定を指定します。列指定に指定した配列データの各配列要素の値を列値とする行が生成され,その行の集合が集まり導出表の結果になります。集まり導出表の結果のn番目の列が,集まり導出表のn番目の列になります。列指定の指定形式については,「6.1.5 名前の修飾」の「(5) 列指定の指定形式」を参照してください。
指定規則を次に示します。
-
列指定には,配列型の列を指定してください。
-
列指定の数は4,000以下にしてください。
-
列指定には,次のすべての条件を満たす実表または外部表の列を指定してください。
-
集まり導出表と同じFROM句に指定している実表または外部表
-
集まり導出表とコンマ結合している実表または外部表
-
集まり導出表よりも左側に指定している実表または外部表
-
-
列指定を複数指定する場合,異なる表の列は指定できません。
集まり導出表の左側に指定した表と集まり導出表のコンマ結合の結果は,左側に指定した表の各行に対して,集まり導出表の結果の各行を組み合わせて連結した行の集合になります。
(例)
このとき,集まり導出表の結果は,次の流れで導出されます。
-
i 番目の列指定が参照する配列データの各配列要素に対して,それをi 番目の列値とする行を,列指定の中で配列要素数が最大となる配列データの配列要素数分だけ生成します。このとき,次の規則が適用されます。
-
列指定の中で配列要素数が最大となる配列要素数をNmaxとします。配列要素数がNmax未満となるj 番目の列指定の配列要素数をNjとする場合,j 番目の列指定の配列データの「Nj+1~Nmax」番目の配列要素にはナル値が補完されます。
-
すべての列指定が参照する配列データが,ナル値または空の配列データの場合,行は生成されません。
-
-
生成された行の集合が,集まり導出表の結果になります。
(例)"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'下線部分が表参照の指定です。
- 例題7
-
表IT1は,CREATE FOREIGN TABLE文の外部データのデータ形式指定にICEBERGを指定して定義した外部表です。タイムトラベル指定を指定して過去の外部データ(スナップショット)を外部表に読み込んで検索します。
-
スナップショットIDを指定する場合
SELECT * FROM "IT1" FOR VERSION AS OF 1234567890123
上記の場合,スナップショットIDが1234567890123のスナップショットが使用されます。
下線部分が表参照のタイムトラベル指定の指定です。
-
時刻印指定を指定する場合
SELECT * FROM "IT1" FOR TIMESTAMP AS OF TIMESTAMP'2025-10-01 10:00:00+09:00'
上記の場合,UTCが2025年10月1日1時以前の中で,最新のスナップショットが使用されます。
下線部分が表参照のタイムトラベル指定の指定です。時刻印指定には,時刻帯付きの時刻印定数を指定しています。
SELECT * FROM "IT1" FOR TIMESTAMP AS OF '2025-10-01 10:00:00+09:00'
上記の場合,UTCが2025年10月1日1時以前の中で,最新のスナップショットが使用されます。
下線部分が表参照のタイムトラベル指定の指定です。時刻印指定には,時刻帯付きの時刻印を表す既定の入力表現の文字列定数を指定しています。
-