Oracle循环插入

时间:2013-03-15 17:54:44

标签: sql oracle loops insert cursor

我在Oracle DB中执行一次批量更新时遇到问题。

我想对映射表进行大量插入,我们可以调用 map

还有其他两个表我必须从中获取数据第一个表是帐户表,我可以从中选择要使用此查询插入的所需帐户:

select account_id
from account
where company_id in (
select company_id
from company
where company_name = 'string');

此查询将根据我要插入的公司名称选择我的所有帐户。

接下来我有一个表格,我们可以打电话给,在这个表中我有确切的组插入数量,组有UID,所以我们有group_id 1到500.

这是我需要做的:我需要在帐户和组之间插入表映射UID映射。没有特殊的顺序需要完成

insert into map (account_id, group_id) 
  values (number,number);

但遗憾的是,我不知道如何使用包含多个结果的选择进行此类批量插入,以及如何计算循环。

所以我的想法就是做这样的事情:

insert into map (account_id, group_id) values ((select account_id
from account
where company_id in (
select company_id
from company
where company_name = 'string')),loop from 1 to 500);

使用group_id可以插入多个account_id但一个account_id只能链接到一个组的规则。

当然这个查询不起作用,我只是想表达我想做的事情。希望这是有道理的。

我知道我想要插入哪里,我知道所有的计数,我知道我有500 account_id s和50 group_id s。它们的顺序意味着account_id 1到500和group_id 1到500,所以我认为在这种情况下以某种方式循环插入应该相当容易。

我希望我尽可能地清楚自己。

感谢您的回答和建议!

3 个答案:

答案 0 :(得分:1)

这将插入帐户ID和组ID的每个组合:

INSERT INTO map(account_id, group_id)
SELECT a.id, g.id
FROM account a, group g
WHERE a.company_id IN ( select company_id 
                        from company 
                        where company_name = 'string');

编辑:如果我理解你的评论正确,你需要这样的东西:

INSERT INTO map(account_id, group_id)
SELECT a.id, g.id
FROM account a, group g
WHERE a.company_id IN ( SELECT company_id 
                        FROM company 
                        WHERE company_name = 'string')
AND 1000 <= a.id AND a.id <= 1500
AND g.id = a.id + 1000;

将帐户1000与组2000连接,将帐户1001与组2001连接,依此类推。现在加入组有点不必要,但它会确保存在具有预期组ID的行(如果不存在则跳过它)。

答案 1 :(得分:1)

这样的东西会起作用。它使用INSERT ... SELECT语法(请参阅示例here)从查询中插入多行。

要循环,请使用此查询交叉连接结果,这将为您提供包含连续数字的500行表。

select LEVEL as group_id from dual connect by LEVEL <= 500

这是最终答案。它未经测试,因此您可能需要修复和调整,但这是一般方法:

insert into map (account_id, group_id)
  select account_id, group_id
    from account
    where company_id in (select company_id 
                         from company 
                         where company_name = 'string')
  cross join (select LEVEL as group_id
              from dual 
              connect by LEVEL <= 500)

添加 - OP询问包含1,000到1,500组(而不是1到500)的查询将如何运作......

CONNECT BY LEVEL始终必须从1开始,因此您需要在内部查询中CONNECT BY LEVEL <= 1500并使用外部WHERE子句过滤掉1到999。这是一个例子;差异全部在交叉加入的查询中:

insert into map (account_id, group_id)
  select account_id, group_id
    from account
    where company_id in (select company_id 
                         from company 
                         where company_name = 'string')
  cross join (
     select group_id from (
       select LEVEL as group_id
         from dual
         connect by LEVEL <= 1500)
     where group_id >= 1000)

我目前无法触及甲骨文,所以这与我之前的回答一样未经测试。

还要注意:像这样上升到1,500是没问题的,但在某些时候你会注意到减速。我不知道它会是10,000或100,000或者是100万,但是迟早你可以碰壁。

答案 2 :(得分:0)

回答你的问题:

INSERT INTO map(account_id, group_id)
SELECT a.id, g.id
  FROM account a
 INNER JOIN company c
    ON a.company_id = c.company_id
   AND c.company_name = 'string'
 CROSS JOIN group g

我的烦恼,退出控制SQL!您不必使用IN