在单个sql语句或过程

时间:2016-09-11 09:43:01

标签: sql stored-procedures oracle10g

我应该如何编写单个sql语句或存储过程,

在1000行和同一列中插入1000个值,每列具有不同的值(在1000个中)

这是我写的查询,

INSERT INTO a_b values
(
  (SELECT max(a_b_id) + 1 from a_b),
  1111,
  (SELECT s_id FROM a_b WHERE s_id in ('0','1','2','3','4')),
  0,
  1,
  sysdate,
  sysdate,
  0,
  1,
  null
);

就像说,我有1000个s_id我想逐个选择它们并将它们插入一个特定列,每次创建一个新行。

EX,在第一行中s_id应该是0然后在第二行它应该是1,就像持续到千,附上我正在使用的示例数据库的图像。

3 个答案:

答案 0 :(得分:2)

您可以使用connect by

INSERT INTO a_b  (s_id, col2, col3, ....)
select level, --<< this value will change for every row
       1111,
       sysdate,
       ... more columns ...
from dual
connect by level <= 1000;

答案 1 :(得分:1)

以下是语法错误。你永远不会得到这样的东西。

create table fff
(   id int not null
);

insert fff values (select 1,7777,select 3, select 3);

所以你需要把它分解成块

DROP PROCEDURE IF EXISTS uspRunMe;
DELIMITER $$
CREATE PROCEDURE uspRunMe()
BEGIN
    insert into a_b select max(a_b_id) + 1 from a_b;
    insert into a_b values (1111);
    insert into a_b SELECT s_id FROM a_b WHERE s_id in ('0','1','2','3','4');
    insert into a_b values (0,1);
    insert into a_b select sysdate,sysdate;
    insert into a_b values (0,1,null);
END;$$
DELIMITER ;

测试它:

call uspRunMe();

以上是针对MySQL的。你在这里标记了一些数据库引擎。

答案 2 :(得分:1)

您可以使用交叉申请获取1000行以及其他1000列,以插入1000行,如下所示:

insert into a_b (column names...)
    select (max(a_b_id) over()) +1 as MaxId, s_id from a_b a cross apply (select 0, 1,SYSDATETIME, SYSDATETIME, 0, 1, null) b where a.s_id('111','222')--condition