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,单插入语句,多列的主要内容,如果未能解决你的问题,请参考以下文章

oracle用sql 语句如何向表中插入时间?

如何用sql语句插入一个带有单引号的值

sql语句插入的数据中含有单引号怎么办?

sql 语句插入一个带有单引号的值

mssql 把一段sql 语句 插入 到数据库的字段中,里面包含多个单引号 和[

oracle用sql语句插入数据,为啥老是显示正在运行