SQL> desc c;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ------------------------
 C                                         NOT NULL VARCHAR2(8)SQL> desc d;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ------------------------
 D                                                  VARCHAR2(8)SQL> select * from cd;C        D
-------- --------
1        a
2        b
1        cSQL> insert all
  2  into c(c)
  3   values(c)
  4  into d(d)
  5   values(d)
  6  select c,d from cd;
insert all
*
ERROR 位于第 1 行:
ORA-00001: 违反唯一约束条件 (TEST.XPK_C)
我想把cd表中的c字段插入c表,d表的d字段插入d表 cd表中的c字段记录相同则c,c表都不插入
1:我在table c上c 字段上建有主键
2:我不想用游标实现,还需要判断,实现速度太慢各位大哥大姐看看有什么样的办法实现

解决方案 »

  1.   

    你的
    insert all
    into c(c) values (c)
    into d(d) values (d)
    select c,d from cd;
    完全没问题,不关系主键的事,执行了超过两次,或者有cd表的c列有重复值
      

  2.   

    除非  执行了超过两次,或者有cd表的c列有重复值,当输入插入到c表时,回因为重复值抱错
      

  3.   

    C列有重复,肯定会出错的,你是要把c字段不重复的插入c表吧,这里需要加辅助列判断才行:INSERT ALL
    WHEN rn = 1 THEN 
    INTO c (c) VALUES(c)
    WHEN rn <>0 THEN
    INTO d (num) VALUES(d)
    SELECT c,d,row_number() over(PARTITION BY c ORDER BY 1) rn FROM cd如果d列也不重复,那就再加一个辅助列就可以了
      

  4.   

    是要报错
    我想得到的结果是
    SQL> select * from c;C        
    -------- 
    1        
    2        
    SQL> select * from d;C        
    -------- 
    a      
    b  
    或者
    SQL> select * from d;C        
    -------- 
    c     
    b  也就是说cd表中的数据只插入两条,
    select *
    from (select t1,t2,t3,t4,
               dense_rank()
               over(partition by t2,t3
               order by t1,t4) dr
       from test
         )
    where dr<2
      

  5.   

    duanzilin(寻) ( ) 信誉:120 回答的很好,很棒,佩服,佩服,今天我一个同事用的辅助列,不过我还没有搞明白,呵呵,多谢大家