在 Oracle 中将一个查询从一个 table 插入多行到另一个
Insert multiple rows with single a query from one table into another in Oracle
我有两个表,dcr_details_new 和 dcr_details_old,其中主键是 DCRDID。
dcr_details_new 和 dcr_details_old 表共享相同的 structure.The 主键是 DCRDID,我在每次插入时递增 1。
我需要将所有行从 dcr_details_old 提取到 dcr_details_new 中,我必须按 DOCREGNO 和 DCR_No
过滤记录
所以一个正常的单行import/insert是运行完全如下
INSERT INTO dcr_details_new
SELECT (select Max(DCRDID) + 1 from dcr_details_new),
TWNCODE,
'100008',
DOCCATOGARY,
DCR_NO,
VISIT_NO,
GIVEAWAY,
COMPETITORBRN,
REMARK,
DCRDRDATE,
COM_ACTI
FROM dcr_details_old
WHERE DOCREGNO= 'T10037'
and DCR_NO = 28766;
1 rows created.
现在我想跳过按 dcr_no
的过滤并插入记录,因为它包含太多具有不同 dcr_no
的记录。在这里,当我仅使用 DOCREGNO
过滤 select 语句 returns 许多记录时,当我尝试循环并插入时,我总是弄乱主键,因为它没有像我希望的那样递增.
这是我尝试过的循环和我遇到的错误。
declare
i integer := 1;
BEGIN
FOR x IN (select * from dcr_details_old WHERE DOCREGNO= 'T10037')
LOOP
INSERT INTO dcr_details_new (DCRDID, TWNCODE, DOCREGNO, DOCCATOGARY,
DCR_NO, VISIT_NO, GIVEAWAY, COMPETITORBRN,
REMARK, DCRDRDATE, COM_ACTI)
SELECT (select Max(DCRDID) + 1 from dcr_details_new),
TWNCODE,
'100008',
DOCCATOGARY,
DCR_NO, VISIT_NO, GIVEAWAY, COMPETITORBRN,
REMARK, DCRDRDATE, COM_ACTI
FROM dcr_details_old;
i := i + 1;
END LOOP;
END;
错误:
**ERROR at line 1:
ORA-00001: unique constraint (SYS_C0061873) violated
ORA-06512: at line 5**
在此错误中 SYS_C0061873
是主键 DCRDID
。
这里插入的值 '100008'
是新的 docregno
我必须手动输入。
有什么简单的方法可以继续吗?请寻求您的帮助。
我很确定你所追求的只是一个单一的插入语句:
INSERT INTO dcr_details_new (dcrdid,
twncode,
docregno,
doccatogary,
dcr_no,
visit_no,
giveaway,
competitorbrn,
remark,
dcrdrdate,
com_acti)
SELECT (SELECT MAX(dcrdid) FROM dcr_details_new) + rownum,
twncode,
'100008',
doccatogary,
dcr_no,
visit_no,
giveaway,
competitorbrn,
remark,
dcrdrdate,
com_acti
FROM dcr_details_old;
使用 "max(val) + some_val" 生成新的主键值通常不是一个好主意。如果这是仅由发布脚本插入的静态数据 table,那么它只是关于 acceptable。就个人而言,我还是宁愿使用序列!
我强烈建议您创建一个起始值为当前最大值 + 1(或其他值)的序列,然后在向 [=19= 添加行时使用 new_seq.nextval
].更简单,更万无一失!
要使用新的主键将 OLD table 中的所有记录插入到 new table 中,请使用以下命令陈述。
请注意,关键部分是获取最大现有密钥并使用 ROWNUM 创建它。
对于单一迁移步骤(即没有并行迁移且应用程序已关闭)这是一种安全的方式。
INSERT INTO dcr_details_new
(DCRDID,TWNCODE,DOCREGNO,DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI)
select
(select max(DCRDID) from dcr_details_new) + rownum as DCRDID,
TWNCODE,DOCREGNO,DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI
from dcr_details_old where DOCREGNO = 'T10037'
;
我认为这个版本适合你。
declare
v_DCRDI number;
begin
select Max(DCRDID)+1 into v_DCRDI from dcr_details_new;
INSERT INTO dcr_details_new
SELECT v_DCRDI+rownum DCRDI, TWNCODE,'100008',DOCCATOGARY,
DCR_NO,VISIT_NO,GIVEAWAY,COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI
FROM dcr_details_old
WHERE DOCREGNO= 'T10037' /*and DCR_NO = 28766*/;
end;
在你的帮助下,这是对我有用的最终答案。
INSERT INTO dcr_details_new
(DCRDID,TWNCODE,DOCREGNO,DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI)
select
(select max(DCRDID) from dcr_details_new) + rownum as DCRDID,
TWNCODE,'100008',DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI
from dcr_details_old where DOCREGNO = 'T10037' ;
谢谢大家
我有两个表,dcr_details_new 和 dcr_details_old,其中主键是 DCRDID。
dcr_details_new 和 dcr_details_old 表共享相同的 structure.The 主键是 DCRDID,我在每次插入时递增 1。
我需要将所有行从 dcr_details_old 提取到 dcr_details_new 中,我必须按 DOCREGNO 和 DCR_No
过滤记录所以一个正常的单行import/insert是运行完全如下
INSERT INTO dcr_details_new
SELECT (select Max(DCRDID) + 1 from dcr_details_new),
TWNCODE,
'100008',
DOCCATOGARY,
DCR_NO,
VISIT_NO,
GIVEAWAY,
COMPETITORBRN,
REMARK,
DCRDRDATE,
COM_ACTI
FROM dcr_details_old
WHERE DOCREGNO= 'T10037'
and DCR_NO = 28766;
1 rows created.
现在我想跳过按 dcr_no
的过滤并插入记录,因为它包含太多具有不同 dcr_no
的记录。在这里,当我仅使用 DOCREGNO
过滤 select 语句 returns 许多记录时,当我尝试循环并插入时,我总是弄乱主键,因为它没有像我希望的那样递增.
这是我尝试过的循环和我遇到的错误。
declare
i integer := 1;
BEGIN
FOR x IN (select * from dcr_details_old WHERE DOCREGNO= 'T10037')
LOOP
INSERT INTO dcr_details_new (DCRDID, TWNCODE, DOCREGNO, DOCCATOGARY,
DCR_NO, VISIT_NO, GIVEAWAY, COMPETITORBRN,
REMARK, DCRDRDATE, COM_ACTI)
SELECT (select Max(DCRDID) + 1 from dcr_details_new),
TWNCODE,
'100008',
DOCCATOGARY,
DCR_NO, VISIT_NO, GIVEAWAY, COMPETITORBRN,
REMARK, DCRDRDATE, COM_ACTI
FROM dcr_details_old;
i := i + 1;
END LOOP;
END;
错误:
**ERROR at line 1:
ORA-00001: unique constraint (SYS_C0061873) violated
ORA-06512: at line 5**
在此错误中 SYS_C0061873
是主键 DCRDID
。
这里插入的值 '100008'
是新的 docregno
我必须手动输入。
有什么简单的方法可以继续吗?请寻求您的帮助。
我很确定你所追求的只是一个单一的插入语句:
INSERT INTO dcr_details_new (dcrdid,
twncode,
docregno,
doccatogary,
dcr_no,
visit_no,
giveaway,
competitorbrn,
remark,
dcrdrdate,
com_acti)
SELECT (SELECT MAX(dcrdid) FROM dcr_details_new) + rownum,
twncode,
'100008',
doccatogary,
dcr_no,
visit_no,
giveaway,
competitorbrn,
remark,
dcrdrdate,
com_acti
FROM dcr_details_old;
使用 "max(val) + some_val" 生成新的主键值通常不是一个好主意。如果这是仅由发布脚本插入的静态数据 table,那么它只是关于 acceptable。就个人而言,我还是宁愿使用序列!
我强烈建议您创建一个起始值为当前最大值 + 1(或其他值)的序列,然后在向 [=19= 添加行时使用 new_seq.nextval
].更简单,更万无一失!
要使用新的主键将 OLD table 中的所有记录插入到 new table 中,请使用以下命令陈述。
请注意,关键部分是获取最大现有密钥并使用 ROWNUM 创建它。 对于单一迁移步骤(即没有并行迁移且应用程序已关闭)这是一种安全的方式。
INSERT INTO dcr_details_new
(DCRDID,TWNCODE,DOCREGNO,DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI)
select
(select max(DCRDID) from dcr_details_new) + rownum as DCRDID,
TWNCODE,DOCREGNO,DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI
from dcr_details_old where DOCREGNO = 'T10037'
;
我认为这个版本适合你。
declare
v_DCRDI number;
begin
select Max(DCRDID)+1 into v_DCRDI from dcr_details_new;
INSERT INTO dcr_details_new
SELECT v_DCRDI+rownum DCRDI, TWNCODE,'100008',DOCCATOGARY,
DCR_NO,VISIT_NO,GIVEAWAY,COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI
FROM dcr_details_old
WHERE DOCREGNO= 'T10037' /*and DCR_NO = 28766*/;
end;
在你的帮助下,这是对我有用的最终答案。
INSERT INTO dcr_details_new
(DCRDID,TWNCODE,DOCREGNO,DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI)
select
(select max(DCRDID) from dcr_details_new) + rownum as DCRDID,
TWNCODE,'100008',DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI
from dcr_details_old where DOCREGNO = 'T10037' ;
谢谢大家