Oracle合并自加入一列中的自我加入



i具有table table1,带有列Col1,col2,col3,col4,col4,col5

如果我的col1值为val1,我想将所有匹配行插入其中col1 = val1的所有匹配行,以便col1 = val2

即。

如果从5行开始,其中col1 = val1,在合并之后,我将获得5行,其中col1 = val2和所有其他列值均被复制。

so:

1(如果没有col1 = val2行,则插入发生2(如果出现col1 = val2行,什么也不会发生。

我一直在尝试下面。它在1(中起作用,但对于2(,但是重新执行该陈述由于基于Col1,Col2,Col4的索引而无法插入,因此无法插入。(rundate是另一个值(

MERGE INTO TABLE1 t1
 USING ( 
          SELECT COL1,COL2COL3,COL4,COL5
          FROM TABLE1
          WHERE COL1 = val2
          AND COL4 <= rundate
          AND ( COL5 IS NULL
                OR COL5 >= rundate)
       ) t2  
 ON (t1.COL1 = t2.COL1)
 WHEN NOT MATCHED THEN
    INSERT (t1.COL1,t1.COL2,t1.COL3,t1.COL4,t1.COL5)
    VALUES (val2,t2.COL2,t2.COL3,t2.COL4,t2.COL5)
  ;

这是使用Merge语句的一种方法。像亚历克斯·普尔(Alex Poole(一样,我不明白为什么必须使用合并;这是一个简单的插件。当您必须同时更新和插入时,合并特别好,具体取决于条件。当您仅根据条件插入时,简单的插入语句就足够了。

无论如何:(仅使用三列,它以相同的方式与五列起作用(这适用于val1 = 1 and val2 = 2,并且它们是硬编码的,但是您可以将它们更改为如果需要(或其他任何其他(提供输入的方法(。

create table table1 ( col1 number, col2 number, col3 number );
insert into table1
  select 1, 101, 300 from dual union all
  select 1, 103, 400 from dual union all
  select 1, 130, 533 from dual union all
  select 2, 103, 400 from dual union all
  select 3, 103, 400 from dual
;
commit;
merge into table1 t
  using ( select col2, col3
          from   table1
          where  col1 = 1
        ) q
     on ( t.col1 = 2 and t.col2 = q.col2 and t.col3 = q.col3 )
when not matched then insert (col1, col2, col3) values (2, q.col2, q.col3)
;
select * from table1;
      COL1       COL2       COL3
---------- ---------- ----------
         1        101        300
         1        103        400
         1        130        533
         2        103        400
         3        103        400
         2        130        533
         2        101        300

最新更新