web-dev-qa-db-ja.com

複数の行を挿入するSQL Teradata

揮発性のテーブルを作成して、テーブルに行を挿入しようとしています。以下のように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);
6
Bocean

ゴードンが言ったように、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を使用して送信する必要があります。

7
dnoeth

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;
2
Gordon Linoff

少なくともTeradataのバージョンでは、CTEで挿入ステートメントを使用できません。代わりに、実際のテーブル(できれば小さいサイズ)を見つけ、上位1を実行します。

Insert Into OtherRealTable(x, y)
Select top 1
   'x' as x, 
   'y' as y
FROM RealTable
0
Eman4real

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を使用します。お役に立てれば :)

0
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
;
0
access_granted