- 行の拡張には3つの異なる方法があります。
- 1 DAY、3 MONTHなど、ユーザ指定の間隔による拡張。
この形式の拡張には、EXPAND ON句にINTERVAL型リテラルを指定する必要があります。このタイプの拡張を、INTERVAL型の拡張といいます。
INTERVAL型の拡張は、「2010年中の週ごとの在庫コストの移動ウィンドウ平均を計算する」といったクエリーに答える場合に役立ちます。
- あるタイム ライン内のユーザ指定のアンカー ポイントによる拡張。
この形式の拡張には、PERIODキーワードを指定せずにアンカー間隔を指定する必要があります。このような拡張を、アンカー ポイント拡張といいます。
アンカー ポイント拡張は、拡張行に特殊な日付または時点を作成します。拡張行では、その日付や時点が、拡張されている入力期間内に存在するアンカー ポイントです。
たとえば、BY ANCHOR MONTH_BEGINは、複数の拡張行を、入力期間内に存在する月の開始値ごとに1行返します。この形式の拡張は、「Get the month end average inventory cost during the last quarter of the year 2010」(2010年最終四半期中の月末平均在庫コストを取得)といった問合わせに答える場合に役立ちます。
- あるタイム ライン内のユーザー指定のアンカー継続期間による拡張。アンカー ピリオド拡張と呼ばれます。
この形式の拡張には、PERIODキーワードを指定してアンカー間隔を指定する必要があります。
アンカーPERIOD拡張によって、行が作成されますが、その期間の開始境界はアンカー名から派生する特定のDateTime値に揃えられます。
例えば、BY ANCHOR PERIOD MONTH_BEGIN、BY ANCHOR PERIOD MONDAYなど。
固定の継続期間に伴う行のPERIOD値によって、「compute the weekly weighted average of inventory cost」(毎週の重みを付けた平均の計算在庫コストの平均を計算する)など重みを付けて計算することができます。
- 1 DAY、3 MONTHなど、ユーザ指定の間隔による拡張。
- EXPAND ON句は問合わせ式で使用できますが、以下の例外があります。
- 検索条件中のサブクエリー 検索条件内のSUBQUERYの指定を参照してください。
例えば、次の文のEXPAND ON句は、employeeのpd1という名前の列への参照により、有効ではありません。
SELECT * FROM employee WHERE salary IN (SELECT salary FROM salary_table WHERE salary > 10000 EXPAND ON pd1);
- WITH句は問合わせ式で指定されます。WITH句を参照してください。
- 更新可能カーソルのSELECT文。<Teradata Vantage™ SQLストアド プロシージャおよび埋め込みSQL、B035-1148>を参照してください。
- CREATE JOIN INDEX文。<Teradata Vantage™ SQLデータ定義言語 - 構文規則および例、B035-1144>の「CREATE JOIN INDEX」を参照してください。
- 問合わせ式はSELECT AND CONSUME文です。SELECT AND CONSUMEを参照してください。
- 検索条件中のサブクエリー 検索条件内のSUBQUERYの指定を参照してください。
- 拡張式は、選択リストから得られる列または列の別名にすることができます。また、拡張する選択リスト内の列または式の位置の順序を指定する数字でもかまいません。
指定した列の並びの位置が無効な場合、例えば、値が列の射影数より大きい場合、Teradata Databaseはエラーを返します。
指定される列は、PERIODデータ型を持っていなければなりません。
EXPAND ON句を持つSELECT文でテーブル参照を指定する必要があります。
- EXPAND ON句は、以下に示す場所のどこにでも指定できます。
- 派生テーブル内。
これには、サブクエリー内に派生テーブルがある場合も含みます。
例: UNION演算子での拡張を参照してください。
- UNION、INTERSECT、またはMINUS/EXCEPTなどの集合演算子を指定するSELECT文の個々のクエリー式の一部として。
例: UNION演算子での拡張を参照してください。
- 以下のSQL DDL文でのSELECT指定の一部として。<Teradata Vantage™ SQLデータ定義言語 - 構文規則および例、B035-1144>で、ビュー定義のシード文および再帰文にあるCREATE RECURSIVE VIEW/REPLACE RECURSIVE VIEW、CREATE TABLE … AS、およびCREATE VIEW/REPLACE VIEWを参照してください。
定義内にEXPAND ON句があるビューは、更新できないので注意してください。
- INSERT … SELECT文でのSELECT指定の一部として。INSERT/INSERT … SELECTを参照してください。
- 派生テーブル内。
- 次の場合にはEXPAND ON句を指定できません。
- SELECT AND CONSUME文のあらゆる場所。SELECT AND CONSUMEを参照してください。
- 更新可能カーソルのあらゆる場所。<Teradata Vantage™ SQLストアド プロシージャおよび埋め込みSQL、B035-1148>を参照してください。
- 検索条件として使用するサブクエリーのあらゆる場所。
- TOP n演算子を指定するSELECT文のあらゆる場所。TOP nを参照してください。
派生テーブル内でTOP n演算子を指定し、次に外側の問合わせでEXPAND ON句を指定することにより、この制限に対処できます。
- SAMPLE句を指定するSELECT文のあらゆる場所。SAMPLE句を参照してください。
- WITH句を指定するSELECT文のあらゆる場所。WITH句を参照してください。
- テーブル関数のあらゆる場所。
- CREATE JOIN INDEX文内のSELECT指定の一部として。<Teradata Vantage™ SQLデータ定義言語 - 構文規則および例、B035-1144>の「CREATE JOIN INDEX」を参照してください。
- LOCAL ORDER BYオプションを含むINSERT... SELECT文のSELECT仕様の一部として。また、この制限は、CREATE TRIGGER、REPLACE TRIGGER、CREATE MACRO、REPLACE MACRO、CREATE PROCEDURE、またはREPLACE PROCEDURE文に含まれるINSERT... SELECT文にも適用されます。
- ターゲット テーブルがNO PRIMARY INDEXで定義されているINSERT... SELECT文のSELECT仕様の一部として。また、この制限は、CREATE TRIGGER、REPLACE TRIGGER、CREATE MACRO、REPLACE MACRO、CREATE PROCEDURE、またはREPLACE PROCEDURE文に含まれるINSERT... SELECT文にも適用されます。
- ORDER BYを除いて、問合わせ式内のすべての操作は、行が拡張される前に実行されます。
ORDER BY句で拡張された列を指定すると、拡張された行にあるORDER BY操作が次に実行されます。
- BY expansion_interval句を指定しないと、拡張間隔のデフォルトは、その列のPERIOD値の構成要素の型の粒度となります。
拡張のデフォルトは、INTERVAL型の拡張のルールと制限で説明するINTERVAL型リテラルのルールです。
- 拡張する行数を制限するには、FOR句でPERIOD式を指定します。このとき、PERIOD式は対象となる期間を表わします。
PERIOD式のデータ型は、expanded_column_nameのPERIODデータ型と互換でなければなりません。
指定した期間がnullで、行とオーバーラップしない場合、行は拡張には適しません。
- Teradata Databaseは、指定する間隔に基づいて行を拡張します。
間隔は、間隔定数とするか、または、曜日、MONTH_BEGINキーワード、またはMONTH_ENDキーワードなどのアンカー名から派生したアンカー間隔のいずれかが可能です。
- EXPAND ON句指定により、指定されたexpansion_intervalから派生した単位時間ごとに値等価行を1つ作成します。行は、拡張された列を除くすべての列内の値が同じであれば、値同等であると言われます。
- FOR句を指定する場合、拡張期間は、修飾された行とFOR句で指定するPERIOD定数とがオーバーラップする期間です。そうでない場合、拡張中の期間は、選択した行のPERIOD値です。
- 拡張中のPERIOD式で、FROM句には指定されていない他のテーブルから得た列を指定する場合、Teradata Databaseは拡張前にテーブルを結合します。
このような場合、適切な結合条件が指定されていることを確認する必要があります。他の結合条件が指定されていない場合、システムは参照されるテーブルに対して積結合を実行します。
例: 拡張前の結合を参照してください。
- 拡張される列を選択リストで指定しなくても、実際にはDISTINCT演算子が指定され、EXPAND演算子はNull化されます。
例: Null化されたEXPAND操作を参照してください。
- 拡張中のPERIODがnullの場合、拡張された行にはnull拡張があります。
例: NULL拡張された値を生むNULL拡張期間を参照してください。
ルールと制限を以下に示します。