2016-03-03 65 views
0

我有兩個表在不同的數據庫中具有相同的列。這兩個表都有記錄。我想插入table1的table1的記錄,但我想忽略已經在表1中的那些記錄。以及我想將所有被忽略的記錄存儲在一個新表中。 例子:從一個表複製行到另一個,忽略遠程重複

create table dest 
(id number primary key, 
col1 varchar2(10)); 

create table src 
(id number, 
col1 varchar2(10)); 

insert into src values(1,'ABC'); 
insert into src values(2,'GHB'); 
insert into src values(3,'DUP'); 
insert into src values(3,'DUP'); 

commit; 

merge into dest 
    using 
    (select id,col1 from src) src on(dest.id=src.id) 
when not matched then 
    insert values(src.id,src.col1) 
when matched 
    then update set dest.col1=src.col1; 

錯誤報告 - SQL錯誤:ORA-00001:唯一約束(SCOTT.SYS_C0010807)違反 00001 00000 - 「唯一約束(%s%S)違反」 *原因: UPDATE或INSERT語句試圖插入重複鍵。 對於在DBMS MAC模式下配置的Trusted Oracle,如果重複條目存在於不同級別,則可能會看到此消息爲 。 *操作:刪除唯一限制或不要插入密鑰。

+0

看一看[合併](https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016。 htm) – Aleksej

回答

0

可以使用intersectminus確定差異

-- Test Data 

-- [email protected] 
with data1(id, 
val) as 
(select 1, 'val1' 
    from dual 
    union all 
    select 2, 'val2' 
    from dual 
    union all 
    select 3, 'val3' 
    from dual), 

-- [email protected] 
data2(id, 
val) as 
(select 1, 'another val1' 
    from dual 
    union all 
    select 2, 'val2' 
    from dual 
    union all 
    select 4, 'val4' 
    from dual) 

-- Intersection 
select 'Intersection', intersection.* 
    from ((select * from data2) intersect (select * from data1)) intersection 

union all 

-- data2 not in data1 
select 'data2 not in data1', d2.* 
    from ((select * from data2) minus (select * from data1)) d2 

union all 

-- data1 not in data2 
select 'data1 not in datad', d1.* 
    from ((select * from data1) minus (select * from data2)) d1; 
+0

使用導出實用程序以csv格式導出第二個表並使用sqlldr實用程序將其加載到表1,並允許錯誤達到您的要求。被拒絕的記錄可以在壞文件中檢查 –

相關問題