0

私はテーブルを持っています1

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

それだけ。

ありがとう!

4

1 に答える 1

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 フィドル

ここnew_dataでは固定値から取得していますが、別のテーブルから取得することも、ストアド プロシージャに値を渡す場合は単一の行として取得することもできます。それmerge自体は、スタンドアロンの SQL にすることも、PL/SQL ブロックに埋め込むこともできます。

new_dataフィールドdt(はdate予約語であり、列の不適切な名前であるため) およびsec_idが既存のレコードと一致する場合、そのレコードは新しいversionおよびで更新されvalueます。一致するものがない場合、新しいレコードが挿入されます。

于 2013-11-12T15:24:08.193 に答える