17.10 - 例: 文字パーティションおよびシステム派生PARTITION[#Ln]列 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-171K-JPN
Language
日本語 (日本)

以下のテーブルが作成済みであるとします。

     CREATE TABLE orders (
       o_orderkey      INTEGER NOT NULL,
       o_custkey       INTEGER,
       o_orderstatus   CHARACTER(1) NOT CASESPECIFIC,
       o_totalprice    DECIMAL(13,2) NOT NULL,
       o_orderdate     DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       o_orderpriority CHARACTER(21),
       o_comment       VARCHAR(79))
     PRIMARY INDEX (o_orderkey)
     PARTITION BY (RANGE_N(o_custkey BETWEEN 0
                                     AND 49999 
                                     EACH 1000),
                   RANGE_N(o_orderdate BETWEEN DATE '2000-01-01' 
                                       AND     DATE '2006-12-31'
                                       EACH INTERVAL '1' MONTH),
                   CASE_N(o_orderstatus = 'S', o_orderstatus = 'C',
                          o_orderstatus = 'F'))
     UNIQUE INDEX (o_orderkey);
     CREATE TABLE lineitem (
       l_orderkey      INTEGER NOT NULL,
       l_partkey       INTEGER NOT NULL,
       l_suppkey       INTEGER,
       l_linenumber    INTEGER,
       l_quantity      INTEGER NOT NULL,
       l_extendedprice DECIMAL(13,2) NOT NULL,
       l_discount      DECIMAL(13,2),
       l_tax           DECIMAL(13,2),
       l_returnflag    CHARACTER(1),
       l_linestatus    CHARACTER(1),
       l_shipdate      DATE FORMAT 'yyyy-mm-dd',
       l_commitdate    DATE FORMAT 'yyyy-mm-dd',
       l_receiptdate   DATE FORMAT 'yyyy-mm-dd',
       l_shipinstruct  VARCHAR(25),
       l_shipmode      VARCHAR(25),
       l_comment       VARCHAR(44))
     PRIMARY INDEX (l_orderkey)
     PARTITION BY (RANGE_N(l_suppkey BETWEEN 0 
                                     AND  4999 
                                     EACH  100),
                   RANGE_N(l_shipdate BETWEEN DATE '2000-01-01' 
                                     AND DATE '2006-12-31' 
                                     EACH INTERVAL '1' MONTH),
                   CASE_N(l_shipmode = 'USPS FirstClass', 
                          l_shipmode = 'UPS', 
                          l_shipmode = 'FedEx', 
                   NO CASE OR UNKNOWN));

以下はシステム派生列PARTITION列の使用例です。

ステータスSが付いたすべての顧客注文の列を選択します。リクエストの選択リストでPARTITION#L3が明示的に指定されなかったため、システムはPARTITION#L3の値を返しません。リクエストは1つのテーブルしか参照しないため、PARTITION#L3を満たすことは必要ではないことに気をつけてください。

     SELECT * 
     FROM orders 
     WHERE orders.PARTITION#L3=1;

IDが1000から1999 (レベル1のパーティション2)の間の顧客で、ステータスがC (レベル3のパーティション2)の注文がある顧客の行を選択します。PARTITION#L1およびPARTITION#L3はリクエストの選択リストで明示的に指定されなかったため、システムはこれらの値を返しません。

     SELECT * 
     FROM orders 
     WHERE orders.PARTITION#L1=2 
     AND   PARTITION#L3=2;

2003年1月(レベル2のパーティション37)の、IDが3700と3799の間(レベル1のパーティション38)のサプライヤーで、出荷モードがFedEx (レベル3のパーティション3)の行を選択します。PARTITIONは組み合わせのパーティション式のパーティション番号で、(PARTITION#L1-1)*84*4+(PARTITION#L2-1)*4+(PARTITION#L3)に等しくなります。 この例では、84はレベル2に対して定義されたパーティションの数で、4はレベル3に対して定義されたパーティションの数です。つまり、12579は(38-1)*84*4+(37-1)*4+3から派生します。

Vantageは、PARTITIONがリクエストの選択リストで明示的に指定されなかったため、PARTITIONの値を返しません。

     SELECT * 
     FROM lineitem 
     WHERE lineitem.PARTITION = 12579;

注文ステータスがF (UPSを使用して出荷された)の注文品目の行を選択します。リクエストでは複数のテーブルが参照されるため、PARTITION#L3はlineitemで修飾される必要があることに注意してください。

     SELECT * 
     FROM orders, lineitem 
     WHERE orders.PARTITION#L3 = 3 
     AND   lineitem.PARTITION#L3 = 2 
     AND   orders.o_orderkey = lineitem.l_orderkey;