最近、Oracleのエラーの話しか書いてない気がするw
便利というか、トランザクション内の処理も1つで済むので、MERGE INTO文を使うことがあります。
実際、
- 新規データならINSERT文
- 変更ならUPDATE文
を実行したいことってよくある。
MERGE INTO文のメリット
ただ、INSERT文とUPDATE文をそれぞれ作って、分岐させて、トランザクションの管理をして・・・
ってのは、少し面倒くさかったりもする。
そんな時に、MERGE INTOは重宝してます。
管理するSQLも1箇所で済むので、個別の修正モレの可能性も減るし。
MERGE INTO文のデメリット
正しく使えれば、デメリットでも何でもないんだけど、SQL文が長くなる。
INSERTとUPDATEの処理を1つに纏めてるのだから、当然っちゃ当然なんだけどw
自分は、MERGE INTO分は苦手。
ON句で対象となる条件の記載方法が良く分からなかったから・・・
ON句の書き方
ぶっちゃけ、ON句が良く分からん\(^o^)/
なので、作成されたMERGEのSQL文を修正することはあっても、自分では極力作らないようにしていた。
っていうか、正しく動くMERGE文が作れなかったから・・・
ということで、どハマリした内容。
それの1つがこれだった。
参考URL
スレッド: MERGE INTOのINSERT文が働かない。
http://www.oracle.co.jp/forum/thread.jspa?threadID=35002915
分かってる人からしたら、至極当然な内容なんだけど、一応、自分なりに分かるように解釈すると、
- USING句に自テーブル(UPDATEやINSERTの対象)を指定すると、USING句内でSelectされた結果と言うのは、ヒットするかしないかになる
- ヒットすればWHEN MATCHED THEN以降のUPDATE(これは記載する状況で変わる)文が実行される
- USING句でヒットしないときにON句での比較そのものが出来ないみたいで、WHEN NOT MATCHED THEN以降のINSERT(これは記載する状況で変わる)文が実行されない
なので、USING句では、対象の主キーなどの条件でレコードが存在するか否かではなく、存在有無を判定したい値をDUALテーブルなんかを使って定義すれば、とりあえずは大丈夫な感じらしい。
今のSQLの知識的にはこんな理解。