如何根据oracle / sql中的条件将数据插入表中

时间:2013-11-12 15:08:49

标签: sql oracle

我有一个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

谢谢!

1 个答案:

答案 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 

SQL Fiddle

new_data来自此处的固定值,但可能来自另一个表,如果您将值传递到存储过程,则可以作为单行。 merge本身可以是独立的SQL,也可以嵌入PL / SQL块中。

如果new_data字段dt(因为date是保留字,而列的名称不正确)且sec_id与现有记录匹配,则该记录为使用新的versionvalue进行了更新。如果没有匹配,则插入新记录。