例: PTIテーブルでUPDATE(Upsert形式) - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - 時系列テーブルと操作の概要

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/zzg1600277315070.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1208
Product Category
Software
Teradata Vantage
PTIテーブルに対するUPDATE(Upsert形式)操作の例を次に示します。ストレージ分散は以下の基づいています。
  • タイムバケット
  • タイムバケットと列句
  • 列句

例: タイムバケットに基づくストレージ分散を含むアップサート

この例で使用するテーブルの定義は次のとおりです。非シーケンス化PTIテーブルocean_buoy_no_seqには、以下が含まれます。
  • 2016年10月15日として指定されたタイム ゼロ、DATE '2016-10-15'。
  • 1時間のタイムバケット、HOURS(1)
CREATE TABLE ocean_buoy_no_seq (
   TD_TIMEBUCKET BIGINT NOT NULL GENERATED SYSTEM TIMECOLUMN,
   TD_TIMECODE   TIMESTAMP(1) NOT NULL GENERATED TIMECOLUMN,
   salinity      INTEGER,
   temperature   INTEGER)
PRIMARY TIME INDEX (TIMESTAMP(1), DATE '2016-10-15', HOURS(1), NONSEQUENCED);
これらのinsert操作により、テーブルにデータ行が設定されます。
INSERT INTO ocean_buoy_no_seq(TIMESTAMP '2016-10-16 10:33:12.1', 23, 33);
INSERT INTO ocean_buoy_no_seq(TIMESTAMP '2016-10-16 11:44:12.1', 24, 34);
INSERT INTO ocean_buoy_no_seq(TIMESTAMP '2016-10-16 12:55:12.1', 25, 35);
この文は、TD_TIMECODE値がTIMESTAMP '2016-10-16 10:33:12.1'に一致する行を更新して、salinityを28に設定します。
UPDATE ocean_buoy_no_seq
SET salinity = 28
WHERE TD_TIMECODE = TIMESTAMP '2016-10-16 10:33:12.1'
ELSE INSERT INTO ocean_buoy_no_seq (TIMESTAMP '2016-10-16 10:33:12.1', 28, 33);
この文は、TD_TIMECODE列に一致する値が見つからなかった後で、新しい行、TIMESTAMP '2016-10-16 10:33:12.6'を挿入します。
UPDATE ocean_buoy_no_seq
SET salinity = 28
WHERE TD_TIMECODE = TIMESTAMP '2016-10-16 10:33:12.6' 
ELSE INSERT INTO ocean_buoy_no_seq (TIMESTAMP '2016-10-16 10:33:12.6', 28, 33);

例: タイムバケットと列句に基づくストレージ分散を含むアップサート

この例で使用するテーブルの定義は次のとおりです。非シーケンス化PTIテーブルocean_buoy_no_seqには、以下が含まれます。
  • 2016年10月15日として指定されたタイム ゼロ、DATE '2016-10-15'。
  • 1時間のタイムバケット、HOURS(1)
  • PRIMARY TIME INDEXのbuoy_id列、COLUMNS(buoy_id)
CREATE TABLE ocean_buoy_no_seq (
   TD_TIMEBUCKET BIGINT NOT NULL GENERATED SYSTEM TIMECOLUMN,
   TD_TIMECODE   TIMESTAMP(1) NOT NULL GENERATED TIMECOLUMN,
   BUOY_ID       INTEGER,
   SALINITY      INTEGER,
   TEMPERATURE   INTEGER)
PRIMARY TIME INDEX (TIMESTAMP(1), DATE '2016-10-15', HOURS(1), COLUMNS(buoy_id), NONSEQUENCED);
これらのinsert操作により、テーブルにデータ行が設定されます。
INSERT INTO ocean_buoy_no_seq(TIMESTAMP '2016-10-16 10:33:12.1', 333, 23, 33);
INSERT INTO ocean_buoy_no_seq(TIMESTAMP '2016-10-16 11:44:12.1', 444, 24, 34);
INSERT INTO ocean_buoy_no_seq(TIMESTAMP '2016-10-16 12:55:12.1', 555, 25, 35);
この文は、TD_TIMECODE値がbuoy_id 333のTIMESTAMP '2016-10-16 10:33:12.1'に一致する行を更新し、salinityを28に設定します。
UPDATE ocean_buoy_no_seq
SET salinity = 28
WHERE TD_TIMECODE = TIMESTAMP '2016-10-16 10:33:12.1' AND
      buoy_id  = 333
ELSE INSERT INTO ocean_buoy_no_seq (TIMESTAMP '2016-10-16 10:33:12.1', 333, 28, 33);
この文は、TD_TIMECODE列に一致する値が見つからなかった後で、新しい行、buoy_id 666のTIMESTAMP '2016-10-16 10:33:12.6'を挿入します。
UPDATE ocean_buoy_no_seq
SET salinity = 28
WHERE TD_TIMECODE = TIMESTAMP '2016-10-16 10:33:12.6' AND
      buoy_id = 666
ELSE INSERT INTO ocean_buoy_no_seq (TIMESTAMP '2016-10-16 10:33:12.6', 666, 28, 33);
この例で使用するテーブルの定義は次のとおりです。シーケンス化PTIテーブルocean_buoy_seqには、以下が含まれます。
  • 2016年10月15日として指定されたタイム ゼロ、DATE '2016-10-15'。
  • 1時間のタイムバケット、HOURS(1)
  • PRIMARY TIME INDEXのbuoy_id列、COLUMNS(buoy_id)
CREATE TABLE ocean_buoy_seq (
   TD_TIMEBUCKET BIGINT NOT NULL GENERATED SYSTEM TIMECOLUMN,
   TD_TIMECODE   TIMESTAMP(6) NOT NULL GENERATED TIMECOLUMN,
   TD_SEQNO      INTEGER NOT NULL GENERATED TIMECOLUMN,
   buoy_id       INTEGER,
   salinity      INTEGER,
   temperature   INTEGER)
PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2016-10-15', HOURS(1), COLUMNS(buoy_id), SEQUENCED(200));
これらのinsert操作により、テーブルにデータ行が設定されます。
INSERT INTO ocean_buoy_seq(TIMESTAMP '2016-10-16 10:33:12.1', 1, 333, 23, 33);
INSERT INTO ocean_buoy_seq(TIMESTAMP '2016-10-16 11:44:12.1', 1, 444, 24, 34);
INSERT INTO ocean_buoy_seq(TIMESTAMP '2016-10-16 12:55:12.1', 1, 555, 25, 35);
この文は、TD_TIMECODE値がbuoy_id 333のTIMESTAMP '2016-10-16 10:33:12.1'およびTD_SEQNO =1に一致する行を更新し、salinityを28に設定します。
UPDATE ocean_buoy_seq
SET salinity = 28
WHERE TD_TIMECODE = TIMESTAMP '2016-10-16 10:33:12.1' AND
      TD_SEQNO = 1 AND buoy_id  = 333
ELSE INSERT INTO ocean_buoy_seq (TIMESTAMP '2016-10-16 10:33:12.1', 1, 333, 28, 33);
この文は、TD_TIMECODE列に一致する値が見つからなかった後で、新しい行、buoy_id 666のTIMESTAMP '2016-10-16 10:33:12.6'およびTD_SEQNO = 1を挿入します。
UPDATE ocean_buoy_seq
SET salinity = 28
WHERE TD_TIMECODE = TIMESTAMP '2016-10-16 10:33:12.6' AND
      TD_SEQNO = 1 AND buoy_id = 666
ELSE INSERT INTO ocean_buoy_seq (TIMESTAMP '2016-10-16 10:33:12.6', 1, 666, 28, 33);

例: 列句に基づくストレージ分散を含むアップサート

この例で使用するテーブルの定義は次のとおりです。非シーケンス化PTIテーブルocean_buoy_no_seqには、以下が含まれます。
  • 2016年10月15日として指定されたタイム ゼロ、DATE '2016-10-15'。
  • PRIMARY TIME INDEXのocean_zone列とbuoy_id列、COLUMNS(ocean_zone, buoy_id)
CREATE TABLE ocean_buoy_no_seq (
   TD_TIMECODE   TIMESTAMP(1) NOT NULL GENERATED TIMECOLUMN,
   ocean_zone    CHAR(2),
   buoy_id       INTEGER,
   salinity      INTEGER,
   temperature   INTEGER)
PRIMARY TIME INDEX (TIMESTAMP(1), DATE '2016-10-15', COLUMNS(ocean_zone, buoy_id), NONSEQUENCED);
これらのinsert操作により、テーブルにデータ行が設定されます。
INSERT INTO ocean_buoy_no_seq(TIMESTAMP '2016-10-16 10:33:12.1', 'PC', 333, 23,33);
INSERT INTO ocean_buoy_no_seq(TIMESTAMP '2016-10-16 11:44:12.1', 'AT', 444, 24,34);
INSERT INTO ocean_buoy_no_seq(TIMESTAMP '2016-10-16 12:55:12.1', 'IN', 555, 25,35);
この文は、TD_TIMECODE値がbuoy_id 333のTIMESTAMP '2016-10-16 10:33:12.1'およびocean_zone = 'PC'に一致する行を更新し、salinityを28に設定します。
UPDATE ocean_buoy_no_seq
SET salinity = 28
WHERE TD_TIMECODE = TIMESTAMP '2016-10-16 10:33:12.1' AND
        ocean_zone = 'PC' AND buoy_id = 333  
ELSE INSERT INTO ocean_buoy_no_seq (TIMESTAMP '2016-10-16 10:33:12.1', 'PC', 333, 23, 33);
この文は、TD_TIMECODE列に一致する値が見つからなかった後で、新しい行、buoy_id 666のTIMESTAMP '2016-10-16 10:33:12.6'およびocean_zone = 'PC'を挿入します。
UPDATE ocean_buoy_no_seq
SET salinity = 28
WHERE TD_TIMECODE = TIMESTAMP '2016-10-16 10:33:12.6' AND
       ocean_zone = 'PC' AND buoy_id = 666
ELSE INSERT INTO ocean_buoy_no_seq (TIMESTAMP '2016-10-16 10:33:12.6', 'PC', 666, 28, 33);
この例で使用するテーブルの定義は次のとおりです。シーケンス化PTIテーブルocean_buoy_seqには、以下が含まれます。
  • 2016年10月15日として指定されたタイム ゼロ、DATE '2016-10-15'。
  • PRIMARY TIME INDEXのocean_zone列とbuoy_id列、COLUMNS(ocean_zone, buoy_id)
CREATE TABLE ocean_buoy_seq (
   TD_TIMECODE   TIMESTAMP(1) NOT NULL GENERATED TIMECOLUMN,
   TD_SEQNO   INTEGER NOT NULL GENERATED TIMECOLUMN,
   ocean_zone    CHAR(2),
   buoy_id       INTEGER,
   salinity      INTEGER,
   temperature   INTEGER)
PRIMARY TIME INDEX (TIMESTAMP(1), DATE '2016-10-15', COLUMNS(ocean_zone, buoy_id), SEQUENCED(20));
これらのinsert操作により、テーブルにデータ行が設定されます。
INSERT INTO ocean_buoy_seq(TIMESTAMP '2016-10-16 10:33:12.1', 1, 'PC', 333, 23,33);
INSERT INTO ocean_buoy_seq(TIMESTAMP '2016-10-16 11:44:12.1', 1, 'AT', 444, 24,34);
INSERT INTO ocean_buoy_seq(TIMESTAMP '2016-10-16 12:55:12.1', 1, 'IN', 555, 25,35);
この文は、TD_TIMECODE値がbuoy_id 333のTIMESTAMP '2016-10-16 10:33:12.1'、TD_SEQNO = 1、およびocean_zone = 'PC'に一致する行を更新し、salinityを28に設定します。
UPDATE ocean_buoy_seq
SET salinity = 28
WHERE TD_TIMECODE = TIMESTAMP '2016-10-16 10:33:12.1' 
AND TD_SEQNO = 1 AND ocean_zone = 'PC' AND buoy_id = 333  
ELSE INSERT INTO ocean_buoy_seq (TIMESTAMP '2016-10-16 10:33:12.1', 1, 'PC', 333, 23, 33);
この文は、TD_TIMECODE列に一致する値が見つからなかった後で、新しい行、buoy_id 666のTIMESTAMP '2016-10-16 10:33:12.6'、TD_SEQNO = 1、およびocean_zone = 'PC'を挿入します。
UPDATE ocean_buoy_seq
SET salinity = 28
WHERE TD_TIMECODE = TIMESTAMP '2016-10-16 10:33:12.6' 
AND TD_SEQNO = 1 AND ocean_zone = 'PC' AND buoy_id = 666
ELSE INSERT INTO ocean_buoy_seq (TIMESTAMP '2016-10-16 10:33:12.6', 1, 'PC', 666, 28, 33);