Oracle sql,单插入语句,多列
Posted
技术标签:
【中文标题】Oracle sql,单插入语句,多列【英文标题】:Oracle sql, single insert statement, multi columns 【发布时间】:2016-04-22 12:01:03 【问题描述】:几周前我看到一篇关于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
。有人对“这个”有想法或有类似的文章吗?
感谢您的帮助。
【问题讨论】:
您能否发布一些输入表的示例数据并简化(例如 10 而不是 200)所需的结果? 我没有任何数据。我就是这样看的。我可以处理插入,但这篇文章困扰了我几天。 Err... USING... 几乎可以肯定,您阅读了有关 MERGE 语句的信息。在 Google 上搜索“Oracle MERGE”,看看是否是您在文章中看到的内容。 【参考方案1】:我会生成一堆数字并在单个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
. . .
【讨论】:
但是假设我有 500 行的表。我需要重复 Select... from... union all... 500 次吗? @MichałM 请用一些行构建一个示例并向我们展示要实现的结果,以便答案可以更好地满足您的需求 @MichałM 。 . .不,您只需要 7 个,一周中的每一天一个。【参考方案2】:您所看到的是(对不起......可能已经 - 虽然请参阅我对您原始问题的评论)插入 (select ...) 语法。例如,假设我有一个表 t,我想克隆它。我在 t 处创建了一个具有相同数量、名称和数据类型(和顺序)的列的表 s,现在我想将所有数据从 t 复制到 s。这样做的简单方法是
insert into s (select * from t);
括号中的内容(子查询)可以是完整的子查询;例如,我可以使用 WHERE 子句来限制将哪些行复制到 s;或者我可以在子查询中使用聚合函数和 GROUP BY 在 s 中插入摘要,而不是克隆数据;唯一的条件是子查询中结果列的数量和数据类型必须与s的一致。
【讨论】:
以上是关于Oracle sql,单插入语句,多列的主要内容,如果未能解决你的问题,请参考以下文章