0

我在我们的 Oracle 数据库中执行一次大规模更新时遇到问题。

我想批量插入映射表,我们可以称之为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只能链接到一组。

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

我因为我知道我到底想在哪里插入什么,并且我知道我有 500account_id秒和 50group_id秒的所有计数。它们也按顺序表示account_id1 到 500 和group_id1 到 500,所以我认为在这种情况下,以某种方式循环插入应该相当容易。

我希望我已经尽可能地把自己说清楚了。

感谢您的回答和建议!

4

3 回答 3

1

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

要进行循环,请将结果与此查询交叉连接,这将为您提供一个包含 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 LEVEL1 开始,因此您需要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)

目前我还没有 Oracle,所以这和我之前的回答一样未经测试。

另请注意:像这样上升到 1,500 是没有问题的,但在某些时候你会注意到速度放缓。我不知道它会是一万、十万还是一百万,但迟早你会碰壁。

于 2013-03-15T18:11:51.340 回答
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 的行(如果不存在则跳过它)。

于 2013-03-15T18:06:58.803 回答
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.

于 2013-03-15T19:07:44.367 回答