Oracle plsql:从选择并忽略重复项插入多行

Oracle plsql:从选择并忽略重复项插入多行,oracle,plsql,Oracle,Plsql,我正在使用Oracle10g和TOAD。 我需要使用insert FROM SELECT插入记录的LAC BEGIN INSERT INTO MYTABLE(C1,C2,C3) SELECT C1,C2,C3 FROM MYTABLE2 WHERE C1>100; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN NULL; COMMIT; END; 这里,我面临的问题是,如果这个select

我正在使用Oracle10g和TOAD。 我需要使用insert FROM SELECT插入记录的LAC

BEGIN    
    INSERT INTO MYTABLE(C1,C2,C3)  
    SELECT C1,C2,C3 FROM MYTABLE2 WHERE C1>100;
EXCEPTION    
         WHEN DUP_VAL_ON_INDEX  THEN NULL;    
COMMIT;    
END;
这里,我面临的问题是,如果这个select查询返回MYTABLE中已经存在的行,那么所有事务都将回滚


是否有办法插入所有不存在的行,忽略重复的行并继续插入不存在的行,然后提交事务?

使用Distinct关键字

开始 插入MYTABLEC1、C2、C3 从MYTABLE2中选择不同的C1、C2、C3,其中C1>100; 例外 当DUP_VAL_在_索引上时,则为NULL; 犯罪
结束

不必尝试处理异常,您可以首先避免这些行,例如,使用减号运算符:

INSERT INTO mytable (c1, c2, c3)  
SELECT c1, c2, c3 
FROM   mytable2 
WHERE  c1 > 100;
MINUS
SELECT c1, c2, c3
FROM   mytable
WHERE  c1 > 100 -- not necessary, but should improve performance

有很多方法可以做到这一点。首先,您可以尝试以下方法:

insert into mytable(c1, c2, c3)
select distinct c1, c2, c3 from mytable2 where c1 > 100
minus
select c1, c2, c3 from mytable;
MERGE INTO mytable2 m2
USING (SELECT DISTINCT c1, c2, c3 FROM mytable) m1 
ON (m1.c1 = m2.c1 and m1.c2 = m2.c2 and m1.c3 = m2.c3) 
WHEN NOT MATCHED THEN INSERT (c1, c2, c3)  VALUES (m1.c1, m1.c2, m1.c3)
where m1.c1 > 100;
否则,您可以使用

insert into mytable(c1, c2, c3)
select c1, c2, c3 from mytable2 where c1 > 100
log errors into myerrtable reject limit unlimited;
等等

关于错误日志记录的更多详细信息。Feauture自10g第2版推出


我想我会给你一个答案,但这真的取决于你想要实现什么

您可以使用以下方法检查数据是否已在表2中:

INSERT INTO mytable2 (c1, c2, c3) 
SELECT DISTINCT c1,c2,c3 FROM mytable t1
WHERE c1 > 100 
AND NOT EXISTS 
(select 1 from mytable2 t2 where t2.c1 = t1.c1 and t2.c2 = t1.c2 and t2.c3 = t1.c3);
或者,您可以使用如下方式的合并:

insert into mytable(c1, c2, c3)
select distinct c1, c2, c3 from mytable2 where c1 > 100
minus
select c1, c2, c3 from mytable;
MERGE INTO mytable2 m2
USING (SELECT DISTINCT c1, c2, c3 FROM mytable) m1 
ON (m1.c1 = m2.c1 and m1.c2 = m2.c2 and m1.c3 = m2.c3) 
WHEN NOT MATCHED THEN INSERT (c1, c2, c3)  VALUES (m1.c1, m1.c2, m1.c3)
where m1.c1 > 100;

在这两个示例中,您将只在mytable2中插入唯一的行

只需选择不同的c1、c2、c3。。。如果不存在,请从mytable mt中选择1,其中mt.c1=mytable.c1和mt.c2=mytable.c2和mt.c3=mytable.c3Hi,select查询将从多个表中获取列。这三列来自三个不同的表格。你比我先编辑。您可能也可以进行合并,但正如您所看到的,有很多方法可以实现合并。当不匹配时,使用m1.c1=m2.c1和m1.c2=m2.c2以及m1.c3=m2.c3上的mytable2 m2合并到mytable m1中,然后插入值m2.c1、m2.c2、m2.c3;您好,Sandeep,select查询从多个表中获取列。这三列来自三个不同的表Hello User1583751,即使select查询从多个表中获取记录,distinct关键字也会删除C1、C2、C3的所有重复项,然后将记录插入MYTABLEdistinct,但在使用多个表时会失败。Select可能会为我提供表2中不同的记录,但在插入表1时,它无法识别表1中的disctinct记录。选择和区分在x表上,插入在y表中:你可以按照Mike的建议使用Merge语句,你可以把你正在使用的SQL查询粘贴到这里吗;[错误]执行49:5:ORA-06550:第13行第5列:PLS-00103:在预期以下情况之一时遇到符号错误::=。@%;嗨,Mureinik,我需要知道我在异常部分跳过了哪些行。然后继续其他记录。但我的问题是,一旦出现例外情况,整个交易就变得扑朔迷离了。