- ベストアンサー
Oracleのmargeについて
- 大規模システムで大容量のテーブルを毎日バッチで取込む必要があります。それに伴い、テーブルの結合とデータの更新処理が課題となっています。そこで、OracleのMERGE文を使用することを検討しています。MERGE文は、異なる列定義を持つテーブル同士の結合やデータの挿入、更新が可能です。
- 例えば、AテーブルからBテーブルにデータを挿入する場合に、MERGE文を使用すると、異なる列定義を持つ両テーブルのデータをマージすることができます。この際、データの一致条件を指定することで、既存のデータを更新したり、新しいデータを追加したりすることができます。
- なお、通常の方法では、Aテーブルの全件をループしてPKを連結し、SELECT-INSERTまたはSELECT-UPDATEの処理を行う必要があります。しかし、データのほとんどが同じ場合や全件が異なる場合でも、MERGE文を使用することで処理時間を軽減することができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Merge文のサンプル。 http://www.shift-the-oracle.com/sql/merge.html Bテーブルの項目数や属性とAテーブルの項目数や属性に依存関係はないです。 例えば、Bテーブルのvarchar2に、AテーブルのdateからTO_CHAR()を使ってデータを格納する とかもできますし、Aテーブルに項目がないので固定値をBテーブルに入れることもできます。 AテーブルとCテーブルを結合した結果を副問い合わせの形で指定すれば、複数のテーブルから 格納することすらできます。 ただね、利用できない条件がOracle10gではあった。 (11gの環境では試していないので大丈夫かもしれませんが) 例 MERGE INTO Out_Table USING In_Table ON ( Out_Table.Key_ID = In_Table.Key_ID) ・・・ で、In_Tableのデータが以下のような場合、 In_Tableのプライマリキー:Key_ID,UpdateDate Key_ID,UpdateDate,・・・ A,2012/1/5 B,2012/1/5 C,2012/1/5 A,2012/2/4 D,2012/2/4 ・・・ Out_TableのKey_IDにAが存在していなくて、 1回のmerge命令で同じレコードに対してInsertとUpdateが同時に行われる場合、 エラーになってました。 べたの場合より早いかどうかは、少なくとも遅くはないとはいえますが、処理によっては同じになる かもしれませんので、早いとは言い切れません。 (でも、プログラムは見やすいのは確実。) ## ANO2の人が書いているXEとは、ユーティリティ類等の一部機能がなかったと思いますが、 ## 基本的にOracleの機能が実装されたソフト。 ## 利用条件にも制約はあったと思いますが、無償。 ## サイズが大きいのでダウンロードでタイムアウトしないかどうかはわかりませんし、 ## ダウンロード元が英語サイトなので、私は、ちょっと薦めるには躊躇しますが、 ## ダウンロードして使う環境を作っておけば、いろいろ試せるので便利なことは確か。 ## 私の使っているとあるノートPCでも動いていたりする。。。
その他の回答 (2)
- dda167
- ベストアンサー率76% (55/72)
>家に実行環境が無い パソコンがあればXEをインストールするという手があります。 >リファレンスのページを見る限り出来なさそうですが それだけでは回答のしようがありません。
お礼
oracleがないんです。さようなら。
- dda167
- ベストアンサー率76% (55/72)
INSERTおよびUPDATEが可能であれば、MERGEもまた可能でしょう。 「べたのやり方」というのがカーソルループでグルグル回すことを 指しているのであれば、MERGE文のほうが遅いということはないでしょう。 机上で考えるより、一度やってみればわかることです。
お礼
ありがとうございます。 家に実行環境が無い為、来週の為の情報収集です。 リファレンスのページを見る限り出来なさそうですが。。
お礼
ありがとうございます。依存関係は無いのですね。 ご提示いただいた例は正にマージする対象テーブル(元)のデータ構造として存在します。 (元)TBはPK指定なしのテーブル構成で、(入)TBはPK指定をしています。 貴重なお話ありがとうございました。 >dda167さん すみませんでした。てっきり冷やかしの方かと思いました。 ノートPCの環境なので、DLして試してみたいと思います。 Oracleの機能が実装されているという事はPlsql・SQLloaderもあるかもしれませんね。Oracleは高くて買う気にもなりません。 やってみます。