Oracle sql,单插入语句,多列

时间:2016-04-22 12:01:04

标签: sql oracle optimization insert

几周前我看到一篇关于oracle sql优化的文章。有一些方法可以插入f.e.一个INSERT语句中有200行,但它不是INSERT ALL子句 像:

INSERT ALL
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date, sales_sun)
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date+1, sales_mon)
SELECT product_id, customer_id, weekly_start_date, sales_sun,
sales_mon, sales_tue, sales_wed, sales_thu, sales_fri, sales_sat
FROM sales_input_table;

我很确定(99%)已经使用PL / SQL(?)中的USING子句完成了。主要问题是"保存"一个插入语句并执行200次而不是"保存" 200插入并执行每一个。

我尝试在Google上搜索,但始终INSERT ALL出现了。任何人都有一个想法或有类似的文章关于"这个"? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我会生成一堆数字并在一个insert中执行此操作。此版本使用union all来处理每个工作日列:

with n as (
     select level as n
     from dual
     connect by level <= 52
    )
insert into sales (prod_id, cust_id, time_id, amount)
    select product_id, customer_id, weekly_start_date + n.n - 1, sales_sun
    from sales_input_table cross join n
    union all
    select product_id, customer_id, weekly_start_date + n.n - 1, sales_mon
    from sales_input_table cross join n
    . . .

答案 1 :(得分:0)

你看到的是(对不起......可能已经 - 请参阅我对原始问题的评论)插入(select ...)语法。例如,假设我有一个表t,我想克隆它。我在t创建一个具有相同数字,名称和数据类型(和顺序)的表,现在我想将所有数据从t复制到s。这样做的简单方法是

insert into s (select * from t);

括号中的内容(子查询)可以是一个完整的子查询;例如,我可以使用WHERE子句来限制将哪些行复制到s;或者我可以在子查询中使用聚合函数和GROUP BY在s中插入摘要,而不是克隆数据;唯一的条件是子查询中结果列的数量和数据类型必须与s的匹配。