揮発性のテーブルを作成して、テーブルに行を挿入しようとしています。以下のように1行アップロードできます...
create volatile table Example
(
ProductID VARCHAR(15),
Price DECIMAL (15,2)
)
on commit preserve rows;
et;
INSERT INTO Example
Values
('Steve',4);
しかし、複数をアップロードしようとすると、エラーが発生します。
「構文エラー: ')'と '、'の間に何かが必要です。」
INSERT INTO Example
Values
('Steve',4),
('James',8);
ゴードンが言ったように、Teradataは複数行のVALUESをサポートしていません(FROMがないため、UNION ALLは失敗します。
代わりにMulti Statement Request(MSR)を利用できます。
INSERT INTO Example Values('Steve',4)
;INSERT INTO Example Values('James',8)
;
BTEQジョブの場合、挿入は最後のセミコロンの後に1ブロックとして送信されます(同じ行で新しいコマンドが開始されると、MSRの一部になります)。 SQL AssistantまたはStudioでは、F9
ではなくF5
を使用して送信する必要があります。
Teradataが複数行のvalues
構文をサポートしているとは思いません。 select
を使用するだけです:
WITH dual as (SELECT 1 as x)
INSERT INTO Example(ProductId, Price)
SELECT 'Steve' as ProductId, 4 as Price FROM dual UNION ALL
SELECT 'James' as ProductId, 8 as Price FROM dual;
少なくともTeradataのバージョンでは、CTEで挿入ステートメントを使用できません。代わりに、実際のテーブル(できれば小さいサイズ)を見つけ、上位1を実行します。
Insert Into OtherRealTable(x, y)
Select top 1
'x' as x,
'y' as y
FROM RealTable
RECURSIVEでこの解決策を見つけました。こんなふうになります:-
INSERT INTO table (col1, col2)
with recursive table (col1, col2) as
(select 'val1','val2' from table) -- 1
select 'val1','val2' from table -- 2
union all select 'val3','val4' from table
union all select 'val5','val6' from table;
行1のデータは挿入されません(ただし、この行が必要です)。 2行目から、val1、val2などに入力したデータがそれぞれの列に挿入されます。挿入する行と同じ数のUNION ALLを使用します。お役に立てれば :)
create table dummy (dumcol varchar(1));
INSERT INTO Student
(Name, Maths, Science, English)
SELECT 'Tilak', 90, 40, 60 from dummy union
SELECT 'Raj', 30, 20, 10 from dummy
;