我在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,所以我认为在这种情况下以某种方式循环插入应该相当容易。
我希望我尽可能地清楚自己。
感谢您的回答和建议!
答案 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
。