• 締切済み

MERGE文について

以下のようなSQL文を作成し、Oracle10gで実行したところ、正常に実行されていたのですが、同一のSQL文をOracle9iで実行したところ、 ORA-00905: キーワードがありません。 とエラーがでてしまいました。 merge文はOracle9iから追加された?ものだったと記憶しているですが、思い違いでしょうか? それともOracle9i、Oracle10gで何か違いがあるのでしょうか? Oracleのバージョンはそれぞれ以下の通りです。 Oracle10g:10.1.0.2.0 Oracle9i:9.0.1.1.1 よろしくお願い致します。 <やりたいこと> A表のa列とb列が、B表のa列とb列と一致したものレコードのみ、B表のc列の内容にA表のc列をアップデートする。(インサートはしない) merge into 表A A using 表B B on (A.a = B.a and A.b = B.b) when matched then update set A.c = B.c /

noname#107693
noname#107693
  • Oracle
  • 回答数2
  • ありがとう数1

みんなの回答

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.2

これかな~ merge into 表A A using (select a,b,c from 表B) B on (A.a = B.a and A.b = B.b) when matched then update set A.c = B.c

noname#107693
質問者

補足

ありがとうございます。 構文そのまんまなんですが、結局、Oracle9i(9.0.1.1.1)環境ではどこでも動かないようですのであきらめました。

回答No.1

環境が無いのでちょっと分からないですが、 update set A.c = B.cは書式が間違っていないでしょうか? update 表A set A.c = B.cのような気がします。 10gでも「update set A.c = B.c」じゃエラーとなるような気が...

noname#107693
質問者

補足

ありがとうございます。 update set A.c = B.c に間違いはありません。 通常のアップデート文では update [table_name] set [field_name] = [値] where [条件文] が基本形ですが、merege文では[条件文]は「on」後ろに、 [table_name]は「into」の後ろに記述します。 よって、10gでは問題なく動作しております。

関連するQ&A

  • Oracle複数の表をもとにmerge文を実行

    Oracle11gでSQL文の質問 merge文を3つ以上の表を使いたいのですが mergeの実行で表Aに表B,表Cの値の挿入はできますか? mergeは表Aと表Bの2つの表の間のやり取りだけのでしょうか? よろしくおねがいします

  • MERGE文を単体テーブルに対して行いたい

    Oracle初心者です。 宜しくお願い致します。 MERGE文を1つのテーブルに対して行いたいのですが、エラーになってしまいます。 すみませんが、教えて下さい。 MERGE INTO TEST A USING TEST B ON (A.SEQ_NO = B.SEQ_NO AND A.SEQ_NO2 = B.SEQ_NO2 AND A.SEQ_NO3 = B.SEQ_NO3) WHEN MATCHED THEN UPDATE文 WHEN NOT MATCHED THEN    INSERT文;

  • sql merge文について

    該当KEY=12345が存在すれば、seqに1を加算、存在しない場合は、seqに1を設定する mergeを使用したsql文を作成したいのですが、 良いサンプルはありませんか? ↓こんな雰囲気でしょうか? MERGE INTO A表 ab USING (SELECT KEY FROM A表 where KEY = 12345 ) ac ON (ab.KEY = ac.KEY) WHEN MATCHED THEN UPDATE SET ac.SEQ = ac.SEQ +1 WHEN NOT MATCHED THEN INSERT (KEY, SEQ) VALUES ("12345",1) よろしくお願いします

  • MERGE文について

    お世話になります。 oracleのMERGE文で アンマッチ時のインサート文にSELECTで 引いた値を入れたいのですが、 ORA-00926エラーになってしまいます。 MERGEのインサート文にSELECTは使えないのでしょうか? 尚、INSERT文単体ではエラーなく挿入できます。 以上、よろしくお願いいたします。 以下、SQLです。 MERGE INTO USER_MASTER UM USING USER_MASTER_IMPORT UI ON ( UM.USER_ID = UI.USER_ID) -- 既存レコードの更新 WHEN MATCHED THEN UPDATE SET USER_NAME = USER_MASTER_IMPORT.USER_NAME -- 新規レコードの作成 WHEN NOT MATCHED THEN INSERT ( USER_ID, USER_NAME, NO ,SHOZOKU_NAME) SELECT UI.USER_ID, UI.USER_NAME, UI.NO, SH.SHOZOKU_NAME FROM USER_MASTER_IMPORT UI LEFT JOIN SHOZOKU SH ON(UI.USER_ID = SH.USER_ID)

  • merge intoについて

    merge into contact A using contact_vw B on (A.postID = B.postID) when matched then update set A.postID = B.postID when not matched then insert values (B.postID, B.postID) 行1でエラーが発生しました。: ORA-00947: 値の個数が不足しています merge intoについて詳しく書いてあるサイト探しています。 よろしくお願いします。

  • oracleでのmerge文のようなもの、ないのでしょうか・・・

     いつもお世話になります。  主キーで検索して、あればupdate、なければinsert という処理を行うにあたって、行の挿入と更新を 1回のSQLで行いたいのですが、oracleでいうmerge文のようなものはmysqlではないのでしょうか??  1回で行いたい理由としては、有り無しの調査をしてからInsertするまでの間に他ユーザーが同時実行をして主キー重複が起きないようにです。  マニュアルを見た所、見あたらなかった為、普通にInsert時のエラー処理で、再試行をしようと思っておりますが、皆様どうされてますでしょうか?  他に良い方法があればと思い、投稿させていただいております。    ご教示いただけると嬉しいです。

    • ベストアンサー
    • MySQL
  • MERGEコマンドについて

    ORACLE9iよりSQL文にMERGEというものが追加されましたが、従来のように一意検索後、データがあれば更新、なければ挿入というプログラムを作った場合よりパフォーマンス的にも向上するでしょうか? カーソルで10万件以上のデータを処理するので単発で0.01秒でも早くなれば感謝感激です。 業務などで実現された方、もしくはオラクルに詳しい方、どうぞよろしくお願いします。

  • こんなSQL文

    Oracle8.1.7を使用しております。 以下のようなテーブルに対し、1行目と2行目を削除するSQL文を書きたいのですが、思いつきません。どなたか、アドバイスいただけないでしょうか? 表名:A   B | C ――――――――   2 | 10   2 | 1   1 | 10   1 | 1   1 | 11   1 | 2   1 | 1   3 | 10   2 | 3 変数として、P1=1とP2=2があります。(これは、SQL文の中に直接書くものとします。) ここで、SELECT B,C FROM A WHERE B=1;とSELECT B,C FROM A WHERE B=2;を実行すると、次のようになります。   B | C     B | C ――――――――― ―――――――――   1 | 10    2 | 10   1 | 1     2 | 1   1 | 11    2 | 3   1 | 2   1 | 1 ここで、それぞれの表を見ると、Cの値が一致している部分があります。この一致していて、Bが2の行を削除したいのですが、SQL1文では無理でしょうか? 最近、SQLには慣れてきたつもりだったのですが、こんなとこでつまずくとは・・・どうぞよろしくお願いします。

  • SQL文を教えてください

    Oracle8i 下記、3つの表に日付を持っています これらのをユニーク且つ降順に取得するSQL文を 教えてください 表A:T_TESA  列:T_TESA_IDATE 型:DATE  例:2006/02/01 2006/02/02 2006/02/04 表B:T_TESB  列:T_TESB_IDATE 型:DATE  例:2006/02/01 2006/02/02 2006/02/03 表C:T_TESC  列:T_TESC_IDATE 型:DATE  例:2006/02/01 2006/01/30 2006/02/03 結果:  2006/02/04  2006/02/03  2006/02/02  2006/02/01  2006/01/30

  • SQLServer MERGEコマンドについて

    初めて投稿させていただきます。 まず、環境に関する情報です。 【環境】 DB:SQLServer2008R2 開発環境:VisualStudio2008 Professional Edition 開発言語:C# C#のプログラムでSQL実行を行うプログラムを作成し、MERGEコマンドを含むSQL文を発行しようとしているのですが、以下のエラーとなってしまいます。 ▼エラー内容 System.Data.SqlClient.SqlException: ストアド プロシージャ '' が見つかりませんでした。 書いたコードはこんな感じです。 ▼ソース内容 public bool MergeData(String strSQL) { try { base.sqlDataAdapter = null; base.OpenConnection(); StringBuilder sqlMerge = new StringBuilder(); //------------------------------------------------------------ // マージ用SQL //------------------------------------------------------------ sqlMerge.Append("MERGE INTO [テーブルA] as T USING [テーブルAtemp] as T2"); sqlMerge.Append(" ON (T.カラム1 = T2.カラム1 and T.カラム2 = T2.カラム2)"); sqlMerge.Append(" WHEN MATCHED THEN"); sqlMerge.Append(" UPDATE SET xxxxx"); ※内容は割愛します sqlMerge.Append(" WHEN not MATCHED THEN"); sqlMerge.Append(" INSERT xxxxx"); ※内容は割愛します //------------------------------------------------------------ // トランザクション開始 //------------------------------------------------------------ base.BeginTransaction(); //------------------------------------------------------------ // 登録用SQL設定 //------------------------------------------------------------ base.SetCommand(sqlMerge.ToString()); //------------------------------------------------------------ // 登録実行 //------------------------------------------------------------ int retValue = base.ExecuteNonQuery(); 「sqlMerge.ToString()」の内容をそのままSQLServerManagementStudioで実行すると正常に処理できることは確認できています。 なぜ上記エラーが出てしまうのか?が分かりません。 お分かりの方がいらっしゃいましたらご教授お願いします。