我有一个table1
Date Sec_ID Version value col5 col6 col7
20131111 001 1 100
20131112 002 2 99
我有一个存储过程将新数据插入table1
所以如果我插入新的日期行:
20131111 001 2 111
20130101 003 1 88
20131111 004 1 90
table1将类似于:
Date Sec_ID Version value col5 col6 col7
20131111 001 2 111
20131112 002 2 99
20130101 003 1 88
20131111 004 1 90
要求:Date和Sec_ID形成主键。 对于具有相同日期和相同Sec_ID的数据,请更新其版本和其他列。 在这种情况下,对于:
20131111 001 1 100
新数据时:
20131111 001 2 111
已插入
它会保持
20131111 001 2 111
仅
谢谢!
答案 0 :(得分:0)
看起来你想要MERGE
。如果您的表名为t42
,您可以执行以下操作:
select * from t42;
DT SEC_ID VERSION VALUE
--------- ---------- ---------- ----------
11-NOV-13 1 1 100
12-NOV-13 2 2 99
merge into t42
using (
select date '2013-11-11' as dt, 1 as sec_id, 2 as version, 111 as value
from dual
union all select date '2013-01-01', 3, 1, 88 from dual
union all select date '2013-11-11', 4, 1, 90 from dual
) new_data
on (new_data.dt = t42.dt and new_data.sec_id = t42.sec_id)
when matched then
update set t42.version = new_data.version, t42.value = new_data.value
when not matched then
insert (t42.dt, t42.sec_id, t42.version, t42.value)
values (new_data.dt, new_data.sec_id, new_data.version, new_data.value);
3 rows merged.
select * from t42;
DT SEC_ID VERSION VALUE
--------- ---------- ---------- ----------
11-NOV-13 1 2 111
12-NOV-13 2 2 99
01-JAN-13 3 1 88
11-NOV-13 4 1 90
new_data
来自此处的固定值,但可能来自另一个表,如果您将值传递到存储过程,则可以作为单行。 merge
本身可以是独立的SQL,也可以嵌入PL / SQL块中。
如果new_data
字段dt
(因为date
是保留字,而列的名称不正确)且sec_id
与现有记录匹配,则该记录为使用新的version
和value
进行了更新。如果没有匹配,则插入新记录。