我有表TABLE1,其中包含列COL1、COL2、COL3、COL4和COL5
如果我有COL1值作为val1,我想把COL1 =val1的所有匹配行插入到这个表中,这样COL1 = val2
即
如果从5行where COL1 = val1开始,在合并之后,我又得到了5行where COL1 = val2和所有其他列值都按原样复制。
所以:
1)如果没有COL1 = val2行,则插入发生。2)如果存在COL1 = val2行,则不执行任何操作。
我一直在尝试下面的方法。它在1)中有效,但在2)中有效,但由于基于col1、col2、col4上的索引的唯一性constarint导致重新执行语句无法插入。(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)
;发布于 2017-06-30 05:36:35
根据您的请求,以下是使用MERGE语句完成此操作的一种方法。像Alex Poole一样,我不明白为什么一定要使用MERGE;这是一个简单的INSERT。当您必须根据条件同时更新和插入时,MERGE特别好;当您仅根据条件插入时,一个简单的INSERT语句就足够了。
无论如何:(只使用三列,它的工作方式与五列相同)这适用于val1 =1和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 300https://stackoverflow.com/questions/44834992
复制相似问题