Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何同时插入到两个表中_Sql_Oracle - Fatal编程技术网

Sql 如何同时插入到两个表中

Sql 如何同时插入到两个表中,sql,oracle,Sql,Oracle,我希望我能够正确地解释这一点。我需要在两个DB表中插入数据。此数据已存储在另外两个表中,但需要迁移。为了简化,让我们假设以下是我的源表: 列为folderid、foldername的文件夹 链接列linkid、url和folderid 我的目标表是: 具有folderid和foldername列的新文件夹 具有列linkid、url和folderid的新链接 还有其他专栏,但它们并不重要。我的问题是,无论是谁设置了原始数据库,都使用java中的随机数生成器来创建文件夹和链接ID,而这些数字完全是

我希望我能够正确地解释这一点。我需要在两个DB表中插入数据。此数据已存储在另外两个表中,但需要迁移。为了简化,让我们假设以下是我的源表:

列为folderid、foldername的文件夹

链接列linkid、url和folderid

我的目标表是:

具有folderid和foldername列的新文件夹

具有列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).

可能有多个链接与该文件夹关联。文件夹表中有200k行,是链接表中的10倍,因此我需要某种脚本,该脚本将运行并拉出所有文件夹,并以新序列作为ID创建新条目。这本身就可以了,但如果我只是这样做,那么一旦ID更改,我就无法将链接映射到文件夹,除非我这样做如果有意义,请在一条语句中使用。

这是一个关于多表插入的好教程:

基本结构是:

INSERT ALL|FIRST
   [WHEN condition THEN] INTO target [VALUES]
   [WHEN condition THEN] INTO target [VALUES]
   ...
   [ELSE] INTO target [VALUES]
SELECT ...
FROM   source_query;
您可能希望重新构造源子查询以创建一列,该列指示每个foldername的第一行,然后可以在when条件中使用该列,以便每个文件夹仅向文件夹表插入一行,然后向链接表插入所有行。您还必须重新调整生成ID的方式,以便每个链接行具有相同的folderID。换句话说,是学习聚合函数的时候了

示例:查看此查询,看看它是否有助于您理解它(提示,folder\u rank可以成为folder\u id的基础,以及group\u rank如何驱动when子句来理解文件夹插入)

或者,在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解决方案已经可以处理这种情况。

您是否被迫只使用一条语句?无法编写存储过程或程序?谢谢链接。我来读一读。我很想学习聚合函数,但我只是一个简单的java开发人员,一直被“移动数据”所困扰。我一点也不知道我要注册什么。非常感谢,这正是我需要的。我的问题比上面更复杂,但我知道我现在需要做什么。
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;