- ベストアンサー
レコードの更新と追加
UPDATE文とINSERT文を使って以下の処理を 考えています。 1.キーYEAR=200503でデータを検索し、 YEAR=200603でSITEN名が同じ場合は YEAR=200503のデータのYEN1~YEN20の値を YEAR=200603のデータのYEN1~YEN20の値にUPDATE。 2.キーYEAR=200504でデータを検索し、 YEAR=200604のデータを作成し、INSERT。 (SITEN、YEN1~YEN20の値はそのままコピー。) 上記のテーブルが下記テーブルのようになるイメージです。 上手くSQL文を書く事が出来ず悩んでおります。 どなたかご教授頂けませんでしょうか? (oracle9iを使用しています) 処理前 YEAR |SITEN|YEN1 |YEN2 |・・・・|YEN10 | --------------------------------------------------- 200503|aaaaa|80 |50 |・・・・|400 | 200504|bbbbb|70 |40 |・・・・|200 | 200603|aaaaa|10 |20 |・・・・|300 | ↓ 処理後 YEAR |SITEN|YEN1 |YEN2 |・・・・|YEN10 | --------------------------------------------------- 200503|aaaaa|80 |50 |・・・・|400 | 200504|bbbbb|70 |40 |・・・・|200 | 200603|aaaaa|80 |50 |・・・・|400 |UPDATEされたデータ 200604|bbbbb|70 |40 |・・・・|200 |INSERTされたデータ
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
1. update TARGET x set (yen1,yen2,yen3,yen4,yen5,…,yen20)= (select yen1,yen2,yen3,yen4,yen5,…,yen20 from TARGET y where x.siten=y.siten and y.year=200503) where x.year=200603; 2. 登録したいデータが登録先に存在しないことを確認の上、 一括インサート。 insert into TARGET select 200604,siten,yen1,yen2,yen3,yen4,yen5,…,yen20 from TARGET x where not exists(select 1 form TARGET y where x.siten=y.siten and y.year=200604); ここからは、蛇足ですが・・ 9iからは、MERGE文が使えるので、インサートする条件、更新する条件が整理できるなら INSERT と UPDATE を一文で処理できる可能性もあります。 例えば、200501~200512を基に、200601~200612を作る。 既に存在すれば、値を更新し、無ければ登録する。 というとき、 merge into TARGET x using TARGET y on (x.SITEN=y.SITEN and x.YEAR=y.YEAR+100 and y.YEAR between 200501 and 200512) when matched then update set x.YEN1=y.YEN1,x.YEN2=y.YEN2,x.YEN3=y.YEN3,…,x.YEN20=y.YEN20 when not matched then insert (YEAR,SITEN,YEN1,YEN2,YEN3,…,YEN20) values(y.YEAR+100,y.YEN1,YEN2,YEN3,…,YEN20) ; テストしてないので、ちょっと怪しいSQLですが..こんな感じです。
その他の回答 (1)
- kenken_pa
- ベストアンサー率42% (3/7)
私は普段ORACLEを使用していますが、さすがに手元にはありませんので 確実な回答ではないことを御了承ください。 1.については以下のようなSQLになります。ポイントはテーブルの別名です。 UPDATE テーブル1 A ,テーブル1 B SET A.YEN1=B.YEN1,A.YEN2=B.YEN2 … WHERE A.YAER=200603 AND (B.YAER=200503 AND A.SITEN=B.SITEN) 2.は比較的簡単ですがやはり別名を使っていわゆるSELECT INSERT を行います。 INSERT INTO テーブル1 (YEAR,SITEN,YEN1,YEN2 …) SELECT 200604,A.SITEN,A.YEN1,A.YEN2 … FROM テーブル1 AS A WHERE A.YEAR=200504 一応手元のAccess2000で試しましたが、ORACLEでもあまり変わりません。 考え方は一緒ですので多少構文を変えれば動きます。