Teradata では、クエリで単一の挿入ステートメントを使用して複数のレコードを挿入できますか。はいの場合、どのように?
次のようなことをしようとしているとしましょう:
insert test_rank (storeid,prodid,sales) values (1,'A',1000) ( 2,'B',2000) ,(3,'C',3000);
しかし、これは teradata では機能せず、3 つのレコードすべてを 1 つのステートメントに挿入できません。
INSERT INTO test_rank (storeid, prodid, sales)
SELECT *
FROM (SELECT *
FROM (SELECT 0 storeid,
1 prodid,
2 sales) T1
UNION ALL
SELECT *
FROM (SELECT 3 storeid,
4 prodid,
5 sales) T2
UNION ALL
SELECT *
FROM (SELECT 6 storeid,
7 prodid,
8 sales) T3
...
)T;
ありがとう、ロブ!あなたのアドバイスは私を助けました。
これがどれほど実用的かはわかりませんが、技術的には次のことが可能です。
INSERT INTO MyTable
SELECT *
FROM
( SELECT 1 AS StoreID
, 'A' AS ProdID
, 1000 AS SALES
UNION
SELECT 2
, 'B'
, 2000
SELECT 3
, 'C'
, 3000
) DT1
;
第 2 に、BTEQ を使用している場合は、フラット ファイルの単一の INSERT ステートメントを繰り返し使用してテーブルをロードする USING コマンドを調べることができます。ただし、その時点で、適切なボリュームで何かを実行している場合は、ボリュームに応じて適切なロード ユーティリティ (MultiLoad または FastLoad) を利用してこのタスクを実行することもできます。
編集 - 2015-12-10
上記の SQL は、UNION 内の各 SELECT が最初に派生テーブルに配置されない限り実行されません。正しい構文については、Anatoly からの以下の回答を参照してください。
小さなデータを扱っている場合は、テキスト ファイル内に値を入れて、Teradata SQLA でインポートすることができます。
タブで区切られた、入力内容からなるテキスト ファイルを作成します (お使いのバージョンでタブが機能しない場合はコンマを使用してください)。
1 A 1000
2 B 2000
3 C 3000
次に、SQLA でインポート モードを選択し、[ファイル] -> [データのインポート] を選択して、次のステートメントを実行します。
insert into YourTable values (?, ?, ?);
正しいデータ型を使用して、事前にテーブルを作成してください。
複雑な動的挿入を試みるよりも、データを使用してテーブルを作成する方が便利な場合があります。
CREATE TABLE db.Inc_Config AS (
SELECT
c.calendar_date,
null as Sent_To,
CURRENT_TIMESTAMP as Sent_Date,
date '2016-01-01' as Inc_Start_Date,
date '2016-02-29' as Inc_End_Date
FROM sys_calendar.CALENDAR c
WHERE
c.calendar_date BETWEEN date '2016-01-01' AND date '2016-02-29'
) WITH data;