在 teradata 中,我们可以在查询中使用单个插入语句插入多条记录吗?如果是,如何?
假设我正在尝试做类似的事情:
insert test_rank (storeid,prodid,sales) values (1,'A',1000) ( 2,'B',2000) ,(3,'C',3000);
但这在 teradata 中无法在一条语句中插入所有 3 条记录。
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;
谢谢,罗伯!你的建议帮助了我。
如果您正在处理小数据,您可以尝试将值放在文本文件中,然后使用 Teradata SQLA 导入它们。
创建一个包含您的输入的文本文件,由制表符分隔(如果制表符在您的版本中不起作用,请使用逗号):
1 A 1000
2 B 2000
3 C 3000
然后在 SQLA 上选择导入模式,文件 -> 导入数据,然后运行以下语句:
insert into YourTable values (?, ?, ?);
确保事先使用正确的数据类型创建表。
我不确定这会有多实用,但从技术上讲,以下是可能的:
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 的答案。
有时用数据创建表而不是尝试进行复杂的动态插入很有用。
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;