繁体   English   中英

如何同时插入两个表

[英]How to insert into two tables at the same time

我希望我能正确解释。 我需要将数据插入两个数据库表中。 此数据已存储在其他两个表中,但需要迁移。 为了简化起见,可以说这是我的源表:

具有列folderid,foldername的文件夹

与列linkid,url和folderid链接

我的目标表是:

new_folder,具有列folderid,foldername

new_link带有列linkid,url和folderid的列

也有其他专栏,但它们并不重要。 我的问题是,设置原始数据库的任何人都使用Java中的随机数生成器来创建文件夹和链接ID,而这些数字是完全垃圾。 需要用数据库中存在的序列生成的数字替换它们。

因此,我需要一个执行如下操作的语句:

insert into new_folder(folderid, foldername), new_link(linkid, url, folderid)
values (select seq_folder_id.nextval, foldername, seq_link_id.nextval, url, seq_folder_id.currval from folder, link where folder.folderid = link.folderid).

文件夹可能有多个链接。 文件夹表中有20万行,链接表中有10倍,因此我需要某种脚本来运行并拉出所有文件夹,并以新序列作为ID创建新条目。 单独这样做会很好,但是如果我这样做,那么一旦ID更改,我就无法将链接映射到文件夹,除非我在一个声明中这样做就行了。

这是有关多表插入的很好的教程:

http://www.oracle-developer.net/display.php?id=209

基本结构是:

INSERT ALL|FIRST
   [WHEN condition THEN] INTO target [VALUES]
   [WHEN condition THEN] INTO target [VALUES]
   ...
   [ELSE] INTO target [VALUES]
SELECT ...
FROM   source_query;

您可能需要重组源子查询以创建一列,该列指示每个文件夹名称的第一行,然后可以在when条件下将每个文件夹的每一行仅插入到文件夹表中,然后将所有行插入到链接表中。 您还必须重新设置如何生成ID,以便每个链接行都具有相同的folderID。 换句话说,您学习集合函数的时间!

示例:查看此查询,看看它是否可以帮助您解决(提示,folder_rank可以成为folder_id的基础,以及group_rank如何驱动when子句来确定文件夹插入)

select dense_rank() over (order by foldername) as folder_rank,
       rank() over (parition by foldername order  by url) as group_rank
     , foldername
     , seq_link_id.nextval
     , url 
from folder, link 
where folder.folderid = link.folderid

或者,看一下在pl / sql而不是纯SQL中执行此操作:

declare
  l_new_folder_id new_folder.folder_id%type;
begin
   for folder_Rec in (select folder_id, foldername from folder)
   loop
      insert into new_folder (folder_id, folder_name) 
      values ( seq_folder_id.nextval, folder_Rec.folder_name) 
      returning folder_id into l_new_folder_id;

      for link_rec in (select url from link where folder_id = folder_rec.folder_id)
          insert into new_link (link_id, folder_id, url) 
          values (seq_link_id.nextval, l_new_folder_id, link_rec.url);
      end loop;
    end loop;
    commit;
end;

有几种方法可以使这只猫变皮,对于初学者来说,复杂的SQL可能不是最佳选择。 另外,检查您的源数据-如果您的文件夹没有任何链接,那么如果要插入无链接文件夹,则纯SQL方法也必须合并外部联接,而不是当前定义。 PL / Sql解决方案已经可以解决这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM