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