- ベストアンサー
ORACLE UPDATE・INSERTについて
- ORACLE9i・PL/SQL上で複雑なUPDATEとINSERTの処理を一回で完了させる方法を教えてください
- 要求された処理を実現するためのUPDATE文とINSERT文の作成方法を教えてください
- 店舗別の予算額欄がゼロの場合にはUPDATEを行い、存在しない店舗の予算レコードの場合にはINSERTを行う方法を教えてください
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 すみません、質問をきちんと読めていませんでした。 >UPDATE、INSERTをそれぞれ一回で完了させるSQL UPDATEとINSERTは別々のSQLで処理したいのですね。 なら、それぞれ --UPDATE update yosan_t target set yosan = ( select g_yosan.yosan from tenpo_m inner join gyoumu on tenpo_m.kbn = gyoumu.kbn inner join g_yosan on gyoumu.yosan_g = g_yosan.yosan_g where target.tenpo = tenpo_m.tenpo ) where yosan = 0 and exists ( select g_yosan.yosan from tenpo_m inner join gyoumu on tenpo_m.kbn = gyoumu.kbn inner join g_yosan on gyoumu.yosan_g = g_yosan.yosan_g where target.tenpo = tenpo_m.tenpo ); --INSERT insert into yosan_t target select tenpo_m.tenpo,g_yosan.yosan from tenpo_m inner join gyoumu on tenpo_m.kbn = gyoumu.kbn inner join g_yosan on gyoumu.yosan_g = g_yosan.yosan_g where not exists ( select * from yosan_t where yosan_t.tenpo = tenpo_m.tenpo); こんな感じでいけると思いますがどうでしょう? 先ほども書きましたがoracle10g XE での確認なので9iでは上手くいかない所があるかもしれません。
その他の回答 (1)
- yamada_g
- ベストアンサー率68% (258/374)
create table yosan_T as select 'A店' tenpo, 5000 yosan from dual union all select 'C店' tenpo, 0 yosan from dual union all select 'D店' tenpo, 3500 yosan from dual; create table tenpo_m as select 'A店' tenpo, '00001' code, '001' kbn from dual union all select 'B店' tenpo, '00002' code, '001' kbn from dual union all select 'C店' tenpo, '00003' code, '003' kbn from dual union all select 'D店' tenpo, '00004' code, '003' kbn from dual union all select 'F店' tenpo, '00030' code, '002' kbn from dual; create table gyoumu as select '001' kbn, 'A' yosan_g from dual union all select '002' kbn, 'A' yosan_g from dual union all select '003' kbn, 'B' yosan_g from dual union all select '004' kbn, 'C' yosan_g from dual; create table g_yosan as select 'A' yosan_g, 10000 yosan from dual union all select 'B' yosan_g, 5000 yosan from dual union all select 'C' yosan_g, 5000 yosan from dual union all select 'D' yosan_g, 3000 yosan from dual; select * from yosan_t order by tenpo; merge into yosan_t target using ( select tenpo_m.tenpo,g_yosan.yosan from tenpo_m inner join gyoumu on tenpo_m.kbn = gyoumu.kbn inner join g_yosan on gyoumu.yosan_g = g_yosan.yosan_g ) src on (target.tenpo = src.tenpo) when matched then update set yosan = case when target.yosan = 0 then src.yosan else target.yosan end when not matched then insert (tenpo, yosan) values (src.tenpo, src.yosan); select * from yosan_t order by tenpo; MERGE文を使えばいいと思います。oracle9iの環境がないのでoracle10g XEでの動作確認です。 丸投げはよくないと思いますけどね・・・というか全然複雑じゃないですし。