在teradata中,我们可以在查询中使用单个insert语句插入多个记录。如果是,怎么样?
说我正在尝试做类似的事情:
insert test_rank (storeid,prodid,sales) values (1,'A',1000) ( 2,'B',2000) ,(3,'C',3000);
但是在teradata中无法在一个语句中插入所有3条记录。
答案 0 :(得分:4)
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;
谢谢,罗布!你的建议帮助了我。
答案 1 :(得分:1)
我不确定这会有多实用,但从技术上来说,以下是可能的:
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
;
其次,如果您正在使用BTEQ,那么您可以查看USING命令与平面文件重复单个INSERT语句一起加载表。但是在那时你可以利用适当的加载实用程序(MultiLoad或FastLoad),具体取决于卷来完成这个任务,如果你做了任何合理的量。
编辑 - 2015-12-10
除非UNION中的每个SELECT首先放在派生表中,否则上面的SQL不会运行。请参阅以下Anatoly的答案,了解正确的语法。
答案 2 :(得分:1)
如果您正在处理小数据,可以尝试将值放在文本文件中,然后使用Teradata SQLA导入它们。
创建一个包含输入的文本文件,由选项卡分隔(如果选项卡在您的版本中不起作用,请使用逗号):
1 A 1000
2 B 2000
3 C 3000
然后在SQLA上选择导入模式,文件 - >导入数据,并运行以下语句:
insert into YourTable values (?, ?, ?);
确保使用正确的数据类型预先创建表格。
答案 3 :(得分:0)
有时创建带有数据的表 非常有用,而不是尝试进行复杂的动态插入。
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;